A "maneira LDAP" para fazer isso seria recuperar o objeto base com o GUID (ou SID), que recuperará apenas o objeto base e não terá dados de classe adicionais anexados. No entanto, a partir desse objeto base, você pode recuperar o real "distinguishedName" para o objeto do usuário. A recuperação do objeto de usuário usando o atributo "distinguishedName" retornará um objeto DirectoryEntry (.Net / C # / PowerShell) ou um objeto iadsUser (VBScript) com dados de classe completa e permitirá que você obtenha quaisquer outros dados de atributos necessários.
O problema é recuperar o objeto inicial com o GUID (ou SID). Algumas fontes dirão que você deve converter o GUID de formato de seqüência de caracteres (ou seja, {28c67c50-9778-47a4-a77a-bf56f238a0c4}) em uma representação de seqüência de caracteres da matriz de bytes (por exemplo, "\ 50 \ 7c \ c6 \ 28 \ 78 \ 97 \ a4 \ 47 \ 7a \ a7 \ bf \ 56 \ f2 \ 38 \ a0 \ c4 ") para passar para o LDAP. De acordo com a documentação da Microsoft , este não é o caso. Uma representação de string simples do GUID / SID é suficiente.
Veja uma amostra de como você pode ligar-se ao objeto por meio do GUID e, em seguida, recuperar o objeto de usuário real com dados de classe completos. Powershell realmente puxa o objeto completo se você ligar com o GUID. Se você usar o VBScript, precisará executar o processo de duas etapas.
Além disso, observe que, embora os documentos da Microsoft digam que vários formatos de string GUID são aceitáveis, o único que eu consegui usar com êxito é remover os caracteres {}. TAMBÉM , por favor note que isto NÃO é uma string "byte-array" correta, mas simplesmente a string GUID sem caracteres especiais.
$strGUID = "{28c67c50-9778-47a4-a77a-bf56f238a0c4}" -replace '-|{|}',''
$guid = [ADSI]"LDAP://<GUID=$strGUID>"
$user = [ADSI]$guid.distinguishedName
O mesmo processo pode ser usado para uma ligação SID. A página do MSDN que descreve isso diz que há vários formatos de fstring disponíveis, mas o mais comum será o formato s-1-5 -...-...-...-....
#Powershell
$strSID="S-1-5-21-500000003-1000000000-1000000003-1001"
$uSid = [ADSI]"LDAP://<SID=$uSid>"
$user = [ADSI]$user.distinguishedName
* QUERYING *
Se você vai realizar uma consulta LDAP para encontrar o objeto (por exemplo, comparando 'objectGUID' a um byte-array ou 'objectSID' a um byte-array), é aí que você precisará fazer o "correto "conversão de matriz de bytes. É importante observar que o byte-matriz tem uma ordem diferente que a representação de seqüência de caracteres, pois é armazenada como BYW WORD WORD WORD-BYTES para GUID e leva em consideração a ordem endian. A conversão da matriz de bytes para um SID tem condições semelhantes.
Existem várias maneiras diferentes de realizar a conversão, a Technet possui um um simples algoritmo vbScript . Você também pode fazer algo mais extravagante com C # / VB.Net usando o System.Guid, ou através de um script simples no PowerShell (tem que amar o 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 $_) }
Você deve então poder consultar o objeto usando um filtro LDAP padrão:
(&(objectClass=User)(objectGUID=c\c6\a4\a7a\bf\f2\a0\c4))
... ou qualquer outra coisa que você esteja procurando. Isso deve funcionar para um SID também.