Traduzindo entre nomes e SIDs
A LSA (Autoridade de Segurança Local ) fornece funções para traduzir entre nomes de usuário, grupo e grupo local e seus valores de SID ( identificador de segurança ) correspondentes. Para localizar nomes de conta, chame a função LsaLookupNames . Essa função retorna o SID como um par de índice RID/Domínio. Para obter o SID como um único elemento, chame a função LsaLookupNames2 . Para localizar SIDs, chame LsaLookupSids.
Essas funções podem traduzir informações de nome e SID de qualquer domínio confiável pelo sistema local.
Antes de traduzir entre nomes de conta e SIDs, seu aplicativo deve obter um identificador para o objeto Policy local, conforme demonstrado em Abrir um Identificador de Objeto de Política.
O exemplo a seguir procura uma conta no SID, considerando o nome da conta.
void GetSIDInformation (LPWSTR AccountName,LSA_HANDLE PolicyHandle)
{
LSA_UNICODE_STRING lucName;
PLSA_TRANSLATED_SID ltsTranslatedSID;
PLSA_REFERENCED_DOMAIN_LIST lrdlDomainList;
LSA_TRUST_INFORMATION myDomain;
NTSTATUS ntsResult;
PWCHAR DomainString = NULL;
// Initialize an LSA_UNICODE_STRING with the name.
if (!InitLsaString(&lucName, AccountName))
{
wprintf(L"Failed InitLsaString\n");
return;
}
ntsResult = LsaLookupNames(
PolicyHandle, // handle to a Policy object
1, // number of names to look up
&lucName, // pointer to an array of names
&lrdlDomainList, // receives domain information
<sTranslatedSID // receives relative SIDs
);
if (STATUS_SUCCESS != ntsResult)
{
wprintf(L"Failed LsaLookupNames - %lu \n",
LsaNtStatusToWinError(ntsResult));
return;
}
// Get the domain the account resides in.
myDomain = lrdlDomainList->Domains[ltsTranslatedSID->DomainIndex];
DomainString = (PWCHAR) LocalAlloc(LPTR, myDomain.Name.Length + 1);
wcsncpy_s(DomainString,
myDomain.Name.Length + 1,
myDomain.Name.Buffer,
myDomain.Name.Length);
// Display the relative Id.
wprintf(L"Relative Id is %lu in domain %ws.\n",
ltsTranslatedSID->RelativeId,
DomainString);
LocalFree(DomainString);
LsaFreeMemory(ltsTranslatedSID);
LsaFreeMemory(lrdlDomainList);
}
No exemplo anterior, a função InitLsaString converte uma cadeia de caracteres Unicode em uma estrutura LSA_UNICODE_STRING . O código para essa função é mostrado em Usando cadeias de caracteres Unicode LSA.
Observação
Essas funções de tradução são fornecidas principalmente para uso por editores de permissões para exibir informações de ACL ( lista de controle de acesso ). Um editor de permissões sempre deve chamar essas funções usando o objeto Policy para o sistema em que o nome ou o SID do identificador de segurança está localizado. Isso garante que o conjunto adequado de domínios confiáveis seja referenciado durante a tradução.
O Windows Controle de Acesso também fornece funções que executam traduções entre SIDs e nomes de conta: LookupAccountName e LookupAccountSid. Se o aplicativo precisar pesquisar um nome de conta ou SID e não usar funcionalidades adicionais da Política de LSA, use as funções do Windows Controle de Acesso em vez das funções de Política LSA. Para obter mais informações sobre essas funções, consulte Controle de Acesso.