web-dev-qa-db-ja.com

SIDを使用してActive Directoryからユーザーの詳細を取得する

ユーザーのSIDがあるときに、ADでユーザーを見つけるにはどうすればよいですか。これらの変更を検出しようとしているので、他の属性に依存したくありません。例:以下を含むユーザーレコードの変更に関するメッセージが表示されます。

Message: User Account Changed:

    Target Account Name:    test12

    Target Domain:  DOMAIN

    Target Account ID:  %{S-1-5-21-3968247570-3627839482-368725868-1110}

    Caller User Name:   Administrator

    Caller Domain:  DOMAIN

    Caller Logon ID:    (0x0,0x62AB1)

    Privileges: -

変更についてユーザーに通知したい。したがって、ADからのアカウント情報が必要です。

10
er4z0r

Windows PowerShellを起動して実行します。

$strSID="S-1-5-21-500000003-1000000000-1000000003-1001"
$uSid = [ADSI]"LDAP://<SID=$strSID>"
echo $uSid

出力は次のようになります。

distinguishedName : {CN=John Doe,OU=Domain Admins,OU=People,OU=xxx,DC=xxx}
Path              : LDAP://<SID=S-1-5-21-500000003-1000000000-1000000003-1001>
22
Tim Abell

これを行う「LDAP方法」は、GUID(またはSID)を使用して基本オブジェクトを取得することです。これにより、基本オブジェクトのみが取得され、追加のクラスデータは添付されません。この基本オブジェクトは、ユーザーオブジェクトの実際の「distinguishedName」を取得できます。「distinguishedName」属性を使用してユーザーオブジェクトを取得すると、完全なクラスデータを持つDirectoryEntryオブジェクト(.Net/C#/ PowerShell)またはiadsUserオブジェクト(VBScript)が返されます必要な他の属性データを取得できます。

問題は、GUID(またはSID)で初期オブジェクトを取得することです。一部のソースでは、文字列形式GUID(つまり、{28c67c50 -9778-47a4-a77a-bf56f238a0c4})をバイト配列の文字列表現に変換します(つまり、「\ 50\7c\c6\28\78\97\a4\47\7a\a7\bf\56\f2\38\a0\c4 ")をLDAPに渡します。 Microsoftのドキュメント によると、これは当てはまりません。GUID/ SIDの単純な文字列表現で十分です。

GUIDを介してオブジェクトにバインドし、完全なクラスデータを含む実際のユーザーオブジェクトを取得する方法のサンプルを次に示します。GUIDでバインドすると、Powershellは実際に完全なオブジェクトをプルします。 VBScriptの場合、2つのステップのプロセスを実行する必要があります。

また、Microsoftのドキュメントでは複数のGUID文字列形式が許容されると述べていますが、私が正常に使用できたのは{}-文字を取り除くことだけです。 [〜#〜]また[〜#〜]、これは[〜#〜]ではないことに注意してください[〜# 〜]正しい「バイト配列」文字列ですが、GUID文字列から特殊文字を取り除いただけです。

$strGUID = "{28c67c50-9778-47a4-a77a-bf56f238a0c4}" -replace '-|{|}',''
$guid = [ADSI]"LDAP://<GUID=$strGUID>"
$user = [ADSI]$guid.distinguishedName

同じプロセスをSIDバインドに使用できます。これを説明するMSDNページでは、いくつかのfstring形式が利用可能であると述べていますが、最も一般的なのはs-1-5 -...-...-...-...形式です。

#Powershell
$strSID="S-1-5-21-500000003-1000000000-1000000003-1001"
$uSid = [ADSI]"LDAP://<SID=$uSid>"
$user = [ADSI]$user.distinguishedName

*クエリ*

LDAPクエリを実行してオブジェクトを検索する場合(たとえば、 'objectGUID'をバイト配列と比較するか、 'objectSID'をバイト配列と比較することにより)、「正しい」バイトを実行する必要があります。配列変換。バイト配列はGUIDのDWORD-Word-WORD-Word-BYTESとして保存され、DOESはエンディアン順を考慮に入れるため、文字列表現とは異なる順序になっていることに注意することが重要です。 SIDのバイト配列の変換には、同様の条件があります。

変換を行う方法はいくつかありますが、Technetには シンプルなvbScriptアルゴリズム があります。また、System.Guidを使用するか、PowerShellの簡単なスクリプトを使用して、C#/ VB.Netをより洗練された方法で実行することもできます(PowerShellが大好きです)。

#Powershell
#   Creates a new System.GUID object from the supplied string.
#   Only need for this example.
$guid = [system.guid]"{28c67c50-9778-47a4-a77a-bf56f238a0c4}" 
$out=""
#Formats the array of integers as a backslash-delimited string of Hex values
$guid.ToByteArray() | %{ $out += $("\{0:x2}" -f $_) }

その後、標準のLDAPフィルターを使用してオブジェクトを照会できるはずです。

(&(objectClass=User)(objectGUID=\50\7c\c6\28\78\97\a4\47\a7\7a\bf\56\f2\38\a0\c4))

...または、他に何を照会するか。これはSIDでも機能するはずです。

4
Ryan Fisher

OK。私はこれをActive Directory経由で行う方法を見つけました。ここにコードを示します。

REM Converts the SID into a format, that can be processed by ADSI or WMI
Function NormalizeSid(strSidToNormalize)
  Dim regEx,strReplace
  strReplace=""
  ' Create regular expression.
  Set regEx = New RegExp
  regEx.Global  = True
  regEx.Pattern = "(%|{|})"
  regEx.IgnoreCase = True

  ' Make replacement.
  NormalizeSid = regEx.Replace(strSidToNormalize, strReplace)
End Function

REM Searches for a SID the in the Message that was passed as argument
REM SID returned will be of the  form %{S-1-5-21-3968247570-3627839482-368725868-1110}
REM NOTE: Neither WMI nor ADSI will accept this. Use NormalizeSid like in FindUser
Function FindSidInMessage(Message)
    Dim strAccountRegex
    Dim objRegex
    Dim objMatch
    Dim strSID

    strAccountRegex = "(\%\{S\-[,0-9,\-]*\})"
    Set objRegex    = new RegExp
    objRegex.Pattern= strAccountRegex

    for each objMatch in objRegex.Execute(Message)
            REM Wscript.StdOut.writeLine "Found an Account ID: " & objMatch.value
            strSID=objMatch.value
    next

    FindSidInMessage=strSID
End Function 

REM Searches Directory for the User matching the SID passed as parameter
Function FindUser(userSID)
    Dim normalizedSID
    Dim objUser

    normalizedSID=NormalizeSid(userSID)
    Wscript.Echo "SID after escaping: " & normalizedSID

    Wscript.StdOut.writeLine "Querying AD to retrieve user-data" 
    Set objUser = GetObject("LDAP://<SID="& normalizedSID & ">")
    FindUser=objUser.EmailAddress
End Function

これが他の人に役立つことを願っています。

2
er4z0r

PSを使用:

$SID = "S-X-X-XX-XXXXXXXXXX-XXXXXXXXXX-XXXXXXXXXX-XXXX"
Get-ADObject -IncludeDeletedObjects -Filter * -Properties * | where{$_.objectSid -eq $SID}
1
Ahtyam