ユーザーの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からのアカウント情報が必要です。
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>
これを行う「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でも機能するはずです。
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
これが他の人に役立つことを願っています。
PSを使用:
$SID = "S-X-X-XX-XXXXXXXXXX-XXXXXXXXXX-XXXXXXXXXX-XXXX"
Get-ADObject -IncludeDeletedObjects -Filter * -Properties * | where{$_.objectSid -eq $SID}