mardi 26 juillet 2011

Comment vérifier le bon fonctionnement de son serveur SysLog ?

0 commentaires
Lors de la mise en place du monitoring de votre réseau et vos serveurs, vous serez peut-être amené à installer un serveur de type SysLog.

Grossièrement, un serveur syslog reçoit et centralise les logs systemes de différentes équipements (routers, serveurs linux, serveurs windows avec convertisseurs, what else ?).

Comment savoir pendant l'installation qui du client ou du serveur ne fonctionne pas correctement.

Solarwinds qui posséde la série de produit KIWI propose bien évidement un serveur SysLog mais, un outil gratuit est disponible en téléchargement afin de généré des messages syslogs et tester ainsi votre serveur.
Cette outil s'appelle Kiwi Syslog Messages Generation et est téléchargeable ici : http://www.kiwisyslog.com/kiwi-sysloggen-download/

lundi 25 juillet 2011

Quel est la version de mon Schéma Active Directory ?

0 commentaires
Faire des mise à jour et des upgrades c'est bien, mais par moment il est pratique de connaitre son point de départ.
Vous allez mettre à jour votre schéma AD, mais quel sa version actuelle ?

Cette information peut se récupérer de façon difféntes en voici 3 :


  1. Utiliser ADSIEdit.msc et aller chercher les propriétés de "CN=Schema,CN=Configuration,DN,mondomaine,DN=extension" :
  2. Utiliser la base de registre (regedit.exe) :
  3. Utiliser la commande "DSQuery" des outils supports windows server :dsquery * cn=schema,cn=configuration,dc=domainname,dc=local -scope base -attr objectVersion

Les correspondances sont les suivantes :
13 -> Windows 2000 server
30 -> Windows Server 2003 RTM, windows 2003 SP1, Windows 2003 SP2
31 -> Windows server 2003 R2
44 -> Windows Server 2008 RTM

A noter que de la même façon il est possible de récupérer la version du schéma exchange, pour plus d'info : http://support.microsoft.com/kb/556086

samedi 12 février 2011

Mise en place d'un répertoire utilisateurs privé automapper par GPO dans un domaine ActiveDirectory Windows 2003

0 commentaires
Dans un domaine ActiveDirectory, il peut être intéressant de centraliser un certains nombres d'information. Par exemple, les fichiers utilisateurs dispersés au 4 coins de l'entreprise et stocker sur chaque ordinateur complexifient la mise en place d'une sauvegarde efficace. Si les utilisateurs centralisent alors leurs fichiers sur un serveurs de fichiers, il est alors facile de faire une sauvegarde en une fois de l'intégralité des fichiers de tous les utilisateurs.

  • Commencer par créer un répertoire sur votre serveur puis partager le.

  • Ajouter/Modifier les droits NTFS pour le groupe "Utilisateurs du domaine"

  • Voici le source du script à mettre en place.
Ce script crée et place automatiquement les droits NTFS sur le répertoire utilisateur, ainsi on s'affranchie le la fastidieuse création de chaque répertoire. Il crée également un raccourci vers la lettre mappée.

' Version 1.0 - Septembre 2010
' ---------------------------------------------------------'
Option Explicit
Dim intRow, objExcel, objSheet, strPathExcel
Dim objFSO, objShell, intRunError, objNetwork
Dim objUser, CurrentUser
Dim Group
Dim WSHNetworkName


Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objShell = CreateObject("Wscript.Shell")
Set objNetwork = CreateObject("WScript.Network")
Set WSHNetworkName = CreateObject("Shell.Application" )

Dim strUser, strHomeFolder, strHomeUserPath, strHomeUserDriveLetter
strHomeUserPath = "\\DC1\USERSPRIVATE$\"
strHomeUserDriveLetter = "U:"

'Verifier si la lettre de lecteur strHomeUserDriveLetter n'est pas déjà utilisé
' si oui, supprimer le mappage pour mettre le notre
Dim AlreadyConnected, intDrive
Dim CheckDrive
Set CheckDrive = objNetwork.EnumNetworkDrives()
On Error Resume Next
AlreadyConnected = False
For intDrive = 0 To CheckDrive.Count - 1 Step 2
If CheckDrive.Item(intDrive) = strHomeUserDriveLetter _
Then AlreadyConnected = True
Next
If AlreadyConnected = True then
objNetwork.RemoveNetworkDrive strHomeUserDriveLetter, True, True
End if

'récup du login
strUser = objNetwork.UserName

'chemin réseau complet du répertoire persu utilisateurs
strHomeFolder = strHomeUserPath & strUser
If strHomeFolder <> "" Then
If Not objFSO.FolderExists(strHomeFolder) Then
On Error Resume Next
objFSO.CreateFolder strHomeFolder
If Err.Number <> 0 Then
On Error GoTo 0
wscript.Echo "Cannot create: " & strHomeFolder
End If
If objFSO.FolderExists(strHomeFolder) Then
' Assign user permission to home folder.
intRunError = objShell.Run("%COMSPEC% /c Echo Y
cacls " & strHomeFolder & " /t /c /g Administrateurs:f " & strUser & ":f", 2, True)
If intRunError <> 0 Then
Wscript.Echo "Error assigning permissions for user " _
& strUser & " to home folder " & strHomeFolder
End If
End If
Else
' Wscript.Echo "Fichier Exist"
End If
objNetwork.MapNetworkDrive strHomeUserDriveLetter, strHomeFolder
WshNetworkName.NameSpace(""&strHomeUserDriveLetter&"\" ).Self.Name = strUser & " - User Private"
End If
Dim objDesktop, objLink
Dim strAppPath, strWorkDir, strIconPath
' --------------------------------------------------

strWorkDir ="U:"
strAppPath = "U:"
strIconPath = "%SystemRoot%\system32\SHELL32.dll,9"
Set objShell = CreateObject("WScript.Shell")
objDesktop = objShell.SpecialFolders("Desktop")
Set objLink = objShell.CreateShortcut(objDesktop & "\Répertoire Utilisateur.lnk")
'---------------------------------------------------
' Section which adds the shortcut's key properties
objLink.Description = "Répertoire Perso"
objLink.HotKey = "CTRL+SHIFT+X"
objLink.IconLocation = strIconPath
objLink.TargetPath = strAppPath
objLink.WindowStyle = 3
objLink.WorkingDirectory = strWorkDir
objLink.Save

WScript.Quit
' End


  • Créer une GPO sur l'OU de vos utilisateurs pour y appliquer un script au login.

dimanche 21 mars 2010

Une console Powershell tout en un !

0 commentaires
L'administration en ligne de commande c'est bien ! Mais quand cela nécessite plusieurs consoles c'est beaucoup moins amusant. Après avoir installé les outils de management de Exchange 2007 (EMS entre autre) sur mon poste client XP, j'ai vite trouvé un intérêt a l'agrémenter d'autres fonctionnalités comme la gestion de Active Directory avec le powershell (outils de chez Quest Software). Malheureusement après installation du package Quest ActiveRoles pour gérer l'active directory avec powershell, je me retrouve avec deux consoles distinctes. Le but est de les "fusionnées".


  1. Pré-requis
    Avoir installé les outils d'administration Exchange 2007 ainsi que le package Active Directory de Quest Software DISPO ICI (necessite Le .NET Framework 3.5SP1)

  2. Exemple de raccourci vers une console Powershell
    %SystemRoot%\system32\Windows\PowerShell\v1.0\powershell.exe -psconsolefile "C:\MesConsolePosh\UneConsole.psc1"

  3. Contenu du fichier .psc1 et modification.
    Il suffit tout simplement de créer un fichier .psc1 qui regroupe tous les autres fichiers consoles comme celui de Exchange, ActiveRoles, VmWare, etc...
    Exemple de fichier intégrant Exchange et ActiveRole :




    <?xml version="1.0" encoding="utf-8"?>
    <PSConsoleFile ConsoleSchemaVersion="1.0">
    <PSVersion>1.0</PSVersion>
    <PSSnapIns>
    <PSSnapIn Name="Microsoft.Exchange.Management.PowerShell.Admin" />
    <PSSnapIn Name="Quest.ActiveRoles.ADManagement" />
    </PSSnapIns>
    </PSConsoleFile>
    Il est maintenant possible dans une seule et même invite de commande d'exécuter des cmdlets Exchange 2007 et ActiveRoles.

  4. Personnalisation et finalisation.
    Lors du lancement de la console il est possible de spécifier un fichier de commande. Celui-ci peut permettre par exemple de définir des alias de commande. Voici un exemple de fichier dérivé de celui de Exchange 2007.






    ## ALIASES ###################################################################
    set-alias list       format-list
    set-alias table      format-table
    ## Confirmation is enabled by default, uncommenting next line will disable it
    # $ConfirmPreference = "None"
    ## EXCHANGE VARIABLEs ########################################################
    $global:exbin = (get-itemproperty HKLM:\SOFTWARE\Microsoft\Exchange\Setup).MsiInstallPath + "bin\"
    $global:exinstall = (get-itemproperty HKLM:\SOFTWARE\Microsoft\Exchange\Setup).MsiInstallPath
    $global:exscripts = (get-itemproperty HKLM:\SOFTWARE\Microsoft\Exchange\Setup).MsiInstallPath + "scripts\"
    $global:AdminSessionADSettings = [Microsoft.Exchange.Data.Directory.AdminSessionADSettings]::Instance
    ## Reset the Default Domain
    $global:AdminSessionADSettings.ViewEntireForest = $false
    $FormatEnumerationLimit = 16

    ## PROMPT ####################################################################

    ## PowerShell can support very rich prompts, this simple one prints the current
    ## working directory and updates the console window title to show the machine
    ## name and directory.

    function prompt{
    $cwd = (get-location).Path
    $scope = "View Entire Forest"
    if (!$AdminSessionADSettings.ViewEntireForest){
    $scope = $AdminSessionADSettings.DefaultScope
    }
    $host.UI.RawUI.WindowTitle = "Machine: " + $(hostname) + " | Scope: " + $scope + " | By Alexandre Létard"
    $host.UI.Write("Yellow", $host.UI.RawUI.BackGroundColor, "[Alex's POSH]")
    " $cwd>"
    }

    ## FUNCTIONs #################################################################
     ## returns all defined functions
     function functions{
        if ( $args )    {
            foreach($functionName in $args )        {
                 get-childitem function:$functionName |
                      foreach { "function " + $_.Name; "{" ; $_.Definition; "}" }
            }
        }
        else    {
            get-childitem function: |
                 foreach { "function " + $_.Name; "{" ; $_.Definition; "}" }
        }
    }
    ## generates a tip of the day
    function get-tip{
        param($local:number=$null)

        if( ($global:exrandom -eq $null) -or ($exrandom -isnot [System.Random]))    {
            $global:exrandom = new-object System.Random
        }

        $culture = [System.Threading.Thread]::CurrentThread.CurrentUICulture.Parent

        if ( test-path "$($global:exbin)\$($culture.Name)\extips.xml" )    {
    $culture = $culture.Name
        }
        else    {
    $culture = 'en'
        }

        if (test-path "$($global:exbin)\$culture\extips.xml")    {
             $local:tips = [xml](get-content $global:exbin\$culture\extips.xml)
            if($local:number -eq $null)       {
                $local:temp = $global:exrandom.Next( 0, $local:tips.topic.developerConceptualDocument.introduction.table.row.Count )
                write-host -fore Yellow ( "Tip of the day #" + $local:temp + ":`n" )
                $local:nav = $tips.topic.developerConceptualDocument.introduction.table.row[$local:temp].entry.CreateNavigator()
                [void] $nav.MoveToFirstChild()
                do            {
                   write-host $nav.Value
                }
                while( $nav.MoveToNext() )
       ""
            }
            else        {
                $local:nav = $tips.topic.developerConceptualDocument.introduction.table.row[$local:number].entry.CreateNavigator()    
       write-host -fore Yellow ( "Tip of the day #" + $local:number + ":`n" )
          
     
                [void] $nav.MoveToFirstChild()
                do            {
                     write-host $nav.Value
                }
                while( $nav.MoveToNext() )
                ""
            }
        }
        else    {
            "Exchange tips file $($global:exbin)\$culture\extips.xml not found!"
        }

        trap    {
    continue
        }
    }


    ## only returns exchange commands

    function get-excommand{
    if ($args[0] -eq $null) {
    get-command -pssnapin Microsoft.Exchange*
    }
    else {
    get-command $args[0] | where { $_.psSnapin -ilike 'Microsoft.Exchange*' }
    }
    }

    ## only returns activerole commands

    function get-adcommand{
    if ($args[0] -eq $null) {
    get-command -pssnapin Quest.ActiveRoles*
    }
    else {
    get-command $args[0] | where { $_.psSnapin -ilike 'Quest.ActiveRoles*' }
    }
    }

    ## only returns PowerShell commands

    function get-pscommand{
    if ($args[0] -eq $null) {
    get-command -pssnapin Microsoft.PowerShell*
    }
    else {
    get-command $args[0] | where { $_.PsSnapin -ilike 'Microsoft.PowerShell*' }
    }
    }
    ## prints the Exchange Banner in pretty colors
    function get-exbanner{
    write-host -foregroundcolor RED "`n         Welcome to the Alex's Management Shell!`n"

    write-host " Full list of cmdlets:          " -no
    write-host -fore Yellow "get-command"

    write-host " Only ActiveRole cmdlets:         " -no
    write-host -fore Yellow "get-excommand"

    write-host " Only Exchange cmdlets:         " -no
    write-host -fore Yellow "get-excommand"

    ## write-host " Only Monad cmdlets:            " -no
    ## write-host -fore Yellow "get-pscommand"

    write-host " Cmdlets for a specific role:   " -no
    write-host -fore Yellow "get-help -role *UM* or *Mailbox*"

    write-host " Get general help:              " -no
    write-host -fore Yellow "help"

    write-host " Get help for a cmdlet:         " -no
    write-host -fore Yellow "help <cmdlet-name> or <cmdlet-name> -?"

    write-host " Show quick reference guide:    " -no
    write-host -fore Yellow "quickref"

    write-host " Exchange team blog:            " -no
    write-host -fore Yellow "get-exblog"

    write-host " Show full output for a cmd:    " -no
    write-host -fore Yellow "<cmd> | format-list`n"
    }
    ## shows quickref guide
    function quickref{
        $culture = [System.Threading.Thread]::CurrentThread.CurrentUICulture.Parent

        if ( test-path "$($global:exbin)\$($culture.Name)\exquick.htm" )    {
    $culture = $culture.Name
        }
        else    {
    $culture = 'en'
        }

        if ( test-path "$($global:exbin)\$culture\exquick.htm" )    {
    invoke-item $global:exbin\$culture\exquick.htm
        }
        else    {
    "Exchange quickstart guide $global:exbin\$culture\exquick.htm not found!"
        }
    }
    function get-exblog{
           invoke-expression 'cmd /c start http://go.microsoft.com/fwlink/?LinkId=35786'
    }

    ## now actually call the functions
    get-exbanner
    get-tip
    write-host -foregroundcolor GREEN "Console Powershell personnalisé (Exchange 2007 + ActiveRole)"
  5. Nouveau raccourci vers notre console.
    %SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe -psconsolefile "C:\Powershell\Console\MaConsole.psc1" -noexit -command ". 'C:\Powershell\Console\StartConsole.ps1'"


Toutes les sources sont mise à disposition gratuitement mais vous les utilisez sous votre propre responsabilité.

Auditer les Database et Mailbox de votre organisation Exchange 2007

0 commentaires
Il peut être utile à un moment ou a un autre de faire un petit point sur votre organisation Exchange. Ou se trouve les banques de données, quel sont les quotas par défaut, quelle est la taille des mailboxs utilisateurs. Voici une idée de départ a creusée ou adapter à votre configuration.

Suivant la taille de votre organisation, le temps d'exécution du script peut être plus ou moins long.

L'idée de ce script est de récupérer une liste de serveur ayant le rôle mailbox et exécutant Exchange 2007. Pour chaque serveur, on récupère alors les databases qui y sont stockées. Et enfin, pour chaque mailbox on récupère les stats.
Les infos collectées sont exportées dans deux fichiers, un pour les databases et un pur les mailboxs.

Le script :
# Recupération des serveurs ayant le role mailbox en Exchange 2007
$Exchange2007MailboxServer = Get-ExchangeServer | Where-Object { $_.AdminDisplayVersion.major -eq 8 -and $_.IsMailboxServer -eq $true}
write-host -Foregroundcolor GREEN "Serveur(s) avec le role de Mailbox :"
write-host $Exchange2007MailboxServer


# initialisation du resultat
$Result = @()
$ResultMailbox = @()


foreach($server in $Exchange2007MailboxServer){
$MailboxDatabaseOnServer = Get-MailboxDatabase -server $server
foreach($MailboxDatabase in $MailboxDatabaseOnServer){
$LineResult = New-Object PSObject
$LineResult | Add-Member NoteProperty -Name "MailboxServer" -Value $server.Name
$LineResult | Add-Member NoteProperty -Name "StorageGroup" -Value $MailboxDatabase.StorageGroup
$LineResult | Add-Member NoteProperty -Name "Database Name" -Value $MailboxDatabase.Name
$LineResult | Add-Member NoteProperty -Name "Edb File Path" -Value $MailboxDatabase.EdbFilePath
$LineResult | Add-Member NoteProperty -Name "Quota Warning" -Value $MailboxDatabase.IssueWarningQuota
$LineResult | Add-Member NoteProperty -Name "Quota Send" -Value $MailboxDatabase.ProhibitSendQuota
$LineResult | Add-Member NoteProperty -Name "Quota Send/Receive" -Value $MailboxDatabase.ProhibitSendReceiveQuota
$Result += $LineResult


$MailboxOndatabase = Get-Mailbox -database $MailboxDatabase.Identity
foreach($Mailbox in $MailboxOnDatabase){
$LineResultMailbox = New-Object PSObject
$LineResultMailbox | Add-Member NoteProperty -Name "Server" -Value $server.Name
$LineResultMailbox | Add-Member NoteProperty -Name "Database" -Value $MailboxDatabase.Identity
$LineResultMailbox | Add-Member NoteProperty -Name "Name" -Value $Mailbox.Name
$LineResultMailbox | Add-Member NoteProperty -Name "SamAccountName" -Value $Mailbox.SamAccountName
$LineResultMailbox | Add-Member NoteProperty -Name "Quota Defaults" -Value $Mailbox.UseDatabaseQuotaDefaults
if($Mailbox.UseDatabaseQuotaDefaults){
$LineResultMailbox | Add-Member NoteProperty -Name "Quota Warning" -Value $MailboxDatabase.IssueWarningQuota
$LineResultMailbox | Add-Member NoteProperty -Name "Quota Send" -Value $MailboxDatabase.ProhibitSendQuota
$LineResultMailbox | Add-Member NoteProperty -Name "Quota Send/Receive" -Value $MailboxDatabase.ProhibitSendReceiveQuota
}else{
$LineResultMailbox | Add-Member NoteProperty -Name "Quota Warning" -Value $Mailbox.IssueWarningQuota
$LineResultMailbox | Add-Member NoteProperty -Name "Quota Send" -Value $Mailbox.ProhibitSendQuota
$LineResultMailbox | Add-Member NoteProperty -Name "Quota Send/Receive" -Value $Mailbox.ProhibitSendReceiveQuota
}


$MailboxStats = Get-MailboxStatistics -identity $Mailbox.Identity
$LineResultMailbox | Add-Member NoteProperty -Name "Quota Status" -Value $MailboxStats.StorageLimitStatus
$LineResultMailbox | Add-Member NoteProperty -Name "Count Item" -Value $MailboxStats.ItemCount
$LineResultMailbox | Add-Member NoteProperty -Name "Total Item Size" -Value $MailboxStats.TotalItemSize
$ResultMailbox += $LineResultMailbox
}

}
}
$Result | Export-Csv "Database-Audit.csv" -notype -force -Encoding UTF8
$ResultMailbox | Export-Csv "Mailbox-Audit.csv" -notype -force -Encoding UTF8

Toutes les sources sont mise à disposition gratuitement mais vous les utilisez sous votre propre responsabilité..

samedi 20 mars 2010

Déplacement massif de boite mail avec Exchange 2007 (EMS)

0 commentaires
Le déplacement de boite mail sur Exchange 2007 est relativement bien étudié. On peut facilement déplacer une mailbox alors même que celle-ci est ouverte par un client Outlook par exemple. Dans ce cas, l'utilisateur verra apparaître brièvement un petit "Déconnecter/Connecter" dans son client messagerie. Toute fois, je conseille bien évidement de déplacer les mailbox à un moment ou les serveurs et les boites mails sont le moins sollicités (la nuit par exemple, le week-end etc..).
Si comme moi il y'a toujours du monde dans votre entreprise de 8h à 20h, alors peut-etre mieux vaut-il utiliser une tache planifiée pour le déplacement des mailbox.

J'ai écrit là un exemple de script, celui n'est surement pas le seul possible et n'est pas forcement adapté à votre architecture mais cela peu servir de point de départ.
Ce scripts récupère la liste des utilisateurs/mailbox a déplacé et le nom de la database de destination. Attention, dans la mesure du possible utiliser un fichier au format UTF8. Ensuite, il déplace les mailbox et génère un deux fichiers de logs (1 Transcript & 1 fichier maison).

Format du fichier utilisateur :


Prenom,Nom,SamAccountName,Database
Jean,Michemuche,jmichemuche,Groupe Stockage 1\Banque 1

Contenu du script :

$ScriptName = "Move-BulkMailbox"
$ScriptVersion = "1.0"

# Fichier contenant les mailbox a déplacée et l'emplacement de destination
$UsersFile = "C:\FREESHARE\BulkMoveMailbox\users.csv"

$Date = Get-Date -format "yyyyMMdd"

# Démarrage du transcript, tout ce qui se passe sur la console est reporter dans le fichier de log
Start-Transcript -path "$Date-TS.log"

# mise en place de mes logs perso
# récupération du fichier des logs s'il existe
if(! ($Logs = Get-Item "$Date.log")){
$Logs = new-item "$Date.log" -type file -force
}

# début d'écriture dans le fichier des logs
$LogsTime = Get-Date -format "dd/MM/yyyy H:mm:ss"
add-content $Logs "$LogsTime - BEGIN [$ScriptName v$ScriptVersion]"

$LogsTime = Get-Date -format "dd/MM/yyyy H:mm:ss"
add-content $Logs "$LogsTime - Import du fichier mailbox : $UsersFile"
import-csv $UsersFile foreach {
$UserPrenom = $_.Prenom
$UserNom = $_.Nom
$UserSamAccountName = $_.SamAccountName
$UserTargetDatabase = $_.Database
$LogsTime = Get-Date -format "dd/MM/yyyy H:mm:ss"
add-content $Logs "$LogsTime - $UserSamAccountName ($UserPrenom $UserNom)."
$ThisMailbox = Get-Mailbox -identity $UserSamAccountName
if(! $?){
$LogsTime = Get-Date -format "dd/MM/yyyy H:mm:ss"
add-content $Logs "$LogsTime - ERROR :: $UserSamAccountName ($UserPrenom $UserNom) does not exist."
}else{
$UserActualDatabase = $ThisMailbox.Database
add-content $Logs "$LogsTime - Déplacement de la boite mail de $UserActualDatabase vers $UserTargetDatabase"
move-mailbox -identity $UserSamAccountName -TargetDatabase "$UserTargetDatabase" -BadItemLimit 0 -confirm:$false
if(! $?){
$LogsTime = Get-Date -format "dd/MM/yyyy H:mm:ss"
add-content $Logs "$LogsTime - FAILED"
}else{
$LogsTime = Get-Date -format "dd/MM/yyyy H:mm:ss"
add-content $Logs "$LogsTime - SUSSECED"
}
}
}
$LogsTime = Get-Date -format "dd/MM/yyyy H:mm:ss"
add-content $Logs "$LogsTime - END"
Stop-Transcript
Voici le contenu de la tache planifiée :

powershell.exe -PSConsoleFile "C:\Exchange2007\Bin\exshell.psc1" -command ".'C:\FREESHARE\BulkMoveMailbox\Move-bulkmailbox.ps1'"

mardi 16 mars 2010

Récuperer la clé d'activation produit en VBS

0 commentaires
Voici un petit script VBS permetant de recuperer la clé d'activation produit de Windows 2003/XP. Localement ou par le reseau


' Trouver la clé d'activation d'un Windows à distance
' www.korben.info
If Wscript.Arguments.Count = 0 Then
strComputer = inputbox("Entrez le
nom de l ordinateur dont vous voulez la clé","Nom de l ordinateur")
if strComputer = "" then wscript.quit
Else
strCOmputer =
Wscript.Arguments.Item(0)
End If
Dim Digits (24)
Digits (0) = "B" :
Digits (1) = "C": Digits (2) = "D": Digits (3) = "F":
Digits (4) = "G":
Digits (5) = "H": Digits (6) = "J": Digits (7) = "K":
Digits (8) = "M":
Digits (9) = "P": Digits (10) = "Q": Digits (11) = "R":
Digits (12) = "T":
Digits (13) = "V": Digits (14) = "W": Digits (15) = "X":
Digits (16) = "Y":
Digits (17) = "2": Digits (18) = "3": Digits (19) = "4":
Digits (20) = "6" :
Digits (21) = "7" : Digits (22) = "8": Digits (23) = "9"
Dim HexBuf (100),
HexDigitalPID (15)
Set objReg =
GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer &
"\root\default:StdRegProv")
objReg.GetBinaryValue &H80000002,
"SOFTWARE\Microsoft\Windows NT\CurrentVersion\", "DigitalProductId", HexBuf
StartOffset = 52 : EndOffset =67
For i = StartOffset to EndOffset
HexDigitalPID (i-StartOffset) = HexBuf(i)
next
' Convertit la clé
produit codée en clé d activation
dLen = 29 : sLen = 15
KEYSTRING =""
for i=dLen-1 to 0 step -1
if ((i + 1) mod 6) = 0 then
KEYSTRING =
KEYSTRING & "-"
else
HN = 0
For N = (sLen -1) to 0 step -1
Value = ( (HN *2^8 ) Or HexDigitalPID (N))
HexDigitalPID (N) = Value \
24
HN = (Value mod 24)
next
KEYSTRING = KEYSTRING & Digits(HN)
end if
next
KEYSTRING2 = StrReverse (KEYSTRING)
WScript.Echo
KEYSTRING2

Hosted by imgur.com