Compartir a través de


Traducción entre nombres y SID

La Entidad de seguridad local (LSA) proporciona funciones para traducir entre los nombres de usuario, grupo y grupo local y sus valores de identificador de seguridad (SID) correspondientes. Para buscar nombres de cuenta, llame a la función LsaLookupNames . Esta función devuelve el SID como un par de índices RID/Dominio. Para obtener el SID como un solo elemento, llame a la función LsaLookupNames2 . Para localizar SID, llame a LsaLookupSids.

Estas funciones pueden traducir información de nombre e SID de cualquier dominio de confianza del sistema local.

Para poder traducir entre nombres de cuenta y SID, la aplicación debe obtener un identificador para el objeto Policy local, como se muestra en Apertura de un identificador de objeto de directiva.

En el ejemplo siguiente se busca el SID de una cuenta, según el nombre de la cuenta.

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
     &ltsTranslatedSID // 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);
}

En el ejemplo anterior, la función InitLsaString convierte una cadena Unicode en una estructura LSA_UNICODE_STRING . El código de esta función se muestra en Uso de cadenas Unicode de LSA.

Nota:

Estas funciones de traducción se proporcionan principalmente para que las usen los editores de permisos para mostrar información de la lista de control de acceso (ACL). Un editor de permisos siempre debe llamar a estas funciones mediante el objeto Policy para el sistema donde se encuentra el nombre o el SID del identificador de seguridad . Esto garantiza que se haga referencia al conjunto adecuado de dominios de confianza durante la traducción.

 

Windows Access Control también proporciona funciones que realizan traducciones entre SID y nombres de cuenta: LookupAccountName y LookupAccountSid. Si la aplicación necesita buscar un nombre de cuenta o un SID y no usa ninguna funcionalidad adicional de directiva de LSA, use las funciones de Windows Access Control en lugar de las funciones de directiva de LSA. Para obtener más información sobre estas funciones, consulte Access Control.