Share via


名前と SID 間の変換

ローカル セキュリティ機関 (LSA) には、ユーザー、グループ、およびローカル グループ名と、対応するセキュリティ識別子 (SID) 値の間で変換する機能が用意されています。 アカウント名を見つけるには、 LsaLookupNames 関数を 呼び出します。 この関数は、SID を RID/ドメイン インデックス ペアとして返します。 SID を 1 つの要素として取得するには、 LsaLookupNames2 関数を 呼び出します。 SID を見つけるには、 LsaLookupSids を呼び出します。

これらの関数は、ローカル システムによって信頼されている任意のドメインから名前と SID 情報を変換できます。

アカウント名と SID の間で変換する前に、「ポリシー オブジェクト ハンドルを開く」で説明されているように、アプリケーションはローカル Policyオブジェクトへのハンドルを取得する必要があります。

次の例では、アカウント名を指定して、アカウントの SID を検索します。

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);
}

前の例では、 InitLsaString 関数は Unicode 文字列を LSA_UNICODE_STRING 構造体に変換します。 この関数のコードについては、「 LSA Unicode 文字列の使用」を参照してください

注意

これらの変換関数は、主にアクセス許可エディターが アクセス制御リスト (ACL) 情報を表示するために使用するために提供されます。 アクセス許可エディターは、名前またはセキュリティ識別子 SID があるシステムの Policy オブジェクトを使用して、常にこれらの関数を呼び出す必要があります。 これにより、翻訳中に適切な信頼されたドメインのセットが参照されるようになります。

 

Windows Access Controlには、SID とアカウント名の間で変換を実行する関数 (LookupAccountNameLookupAccountSid) も用意されています。 アプリケーションでアカウント名または SID を検索する必要があり、追加の LSA ポリシー機能を使用しない場合は、LSA ポリシー機能の代わりに Windows Access Control関数を使用します。 これらの関数の詳細については、「Access Control」を参照してください。