web-dev-qa-db-fra.com

Comment récupérer le SID d'un ordinateur Windows à l'aide de WMI?

Je ne recherche pas de SID utilisateur. Je recherche le SID de l'ordinateur, qu'Active Directory utiliserait pour identifier l'ordinateur de manière unique. Je ne veux pas non plus interroger le serveur Active Directory, je veux interroger l'ordinateur lui-même.

25
Mark

(Ooh, c'était amusant! J'ai fait une chasse aux oies sauvages, comme on dit, en essayant d'obtenir l'instance Win32_SID, qui est un singleton et non énumérable par les méthodes InstancesOf ou Query habituelles ... yadda yadda yadda.)

Eh bien, cela dépend du SID de l'ordinateur que vous voulez (sérieusement!). Il y a le SID que l'ordinateur local utilise pour lui-même ... Pour cela, il vous suffit d'obtenir le SID de l'utilisateur Administrateur local et de retirer le "-500" à la fin pour obtenir le SID de l'ordinateur.

Dans VBScript , cela ressemble à ceci:

strComputer = "AFAPC001"
strUsername = "Administrator"
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set objAccount = objWMIService.Get("Win32_UserAccount.Name='" & strUsername & "',Domain='" & strComputer & "'")
WScript.Echo "Administrator account SID: " & objAccount.SID
WScript.Echo "Computer's SID: " & Left(objAccount.SID, Len(objAccount.SID) - 4)

Dans PowerShell , comme ceci:

function get-sid
{
    Param ( $DSIdentity )
    $ID = new-object System.Security.Principal.NTAccount($DSIdentity)
    return $ID.Translate( [System.Security.Principal.SecurityIdentifier] ).toString()
}
> $admin = get-sid "Administrator"
> $admin.SubString(0, $admin.Length - 4)

Dans C # sur .NET 3.5:

using System;
using System.Security.Principal;
using System.DirectoryServices;
using System.Linq;
public static SecurityIdentifier GetComputerSid()
{
    return new SecurityIdentifier((byte[])new DirectoryEntry(string.Format("WinNT://{0},Computer", Environment.MachineName)).Children.Cast<DirectoryEntry>().First().InvokeGet("objectSID"), 0).AccountDomainSid;
}

Les résultats de tous ces éléments correspondent à la réponse que j'obtiens de PsGetSid.exe .


D'un autre côté, il y a le SID qu'Active Directory utilise pour identifier chaque ordinateur membre du domaine ... Celui que vous récupérez en obtenant le SID du compte d'ordinateur dans le domaine - celui qui se termine par un signe dollar.

Par exemple, en utilisant la fonction PowerShell ci-dessus pour un membre de domaine appelé "CLIENT", vous pouvez taper get-sid "CLIENT$".

39
ewall

Vous pouvez simplement exécuter reg query HKLM\SOFTWARE\Microsoft\Cryptography /v MachineGuid à partir de la ligne de commande Windows.

Voici un exemple de fichier batch Windows:

set KEY_REGKEY=HKLM\SOFTWARE\Microsoft\Cryptography
set KEY_REGVAL=MachineGuid

REM Check for presence of key first.
reg query %KEY_REGKEY% /v %KEY_REGVAL% 2>nul || (echo No theme name present! & exit /b 1)

REM query the value. pipe it through findstr in order to find the matching line that has the value. only grab token 3 and the remainder of the line. %%b is what we are interested in here.
set KEY_NAME=
for /f "tokens=2,*" %%a in ('reg query %KEY_REGKEY% /v %KEY_REGVAL% ^| findstr %KEY_REGVAL%') do (
    set KEY_NAME=%%b
)
echo %KEY_NAME%
2
l0pan

Trouvé un outil sur le site Web de Microsoft qui peut vous obtenir facilement le SID

http://technet.Microsoft.com/en-us/sysinternals/bb897417.aspx

Téléchargez simplement le fichier, décompressez-le, ouvrez une invite de commande, puis exécutez psgetsid.exe.

Il y a aussi de bonnes explications sur SID sur le site Web de Microsoft

http://blogs.msdn.com/b/aaron_margosis/archive/2009/11/05/machine-sids-and-domain-sids.aspx

1
deadcode