管理受信任的域信息

LSA Policy 提供了多个函数,可用于创建、枚举和删除受信任的域,以及设置和检索受信任的域信息。

在管理受信任的域信息之前,应用程序必须获取 Policy 对象的句柄,如 打开策略对象句柄中所述。

可以通过调用 LsaEnumerateTrustedDomainsEx 来枚举受信任的域。

若要检索有关受信任域的信息,请调用 LsaQueryTrustedDomainInfoLsaQueryTrustedDomainInfoByName。 这两个函数返回相同的信息:但是, LsaQueryTrustedDomainInfo 通过 SID 标识受信任的域, LsaQueryTrustedDomainInfoByName 按名称标识受信任的域。

若要设置受信任域的信息,请调用 LsaSetTrustedDomainInformationLsaSetTrustedDomainInfoByName。 与查询函数一样, LsaSetTrustedDomainInformation 通过 SID 标识受信任的域,而 LsaSetTrustedDomainInfoByName 则按名称标识受信任的域。

应用程序可以通过调用 LsaDeleteTrustedDomain 来撤销受信任域的信任关系。

以下示例枚举本地系统的受信任域。

#include <windows.h>

void EnumerateTrusts(LSA_HANDLE PolicyHandle)
{
  LSA_ENUMERATION_HANDLE hEnum=0; 
  PLSA_TRUST_INFORMATION TrustInfo = NULL;
  ULONG ulReturned = 0;               
  NTSTATUS Status = 0;
  ULONG i;
  WCHAR StringBuffer[256];

  // Enumerate the trusted domains until there are no more to return.
  do 
  {
    Status = LsaEnumerateTrustedDomains(
       PolicyHandle,         // an open policy handle
       &hEnum,               // enumeration tracker
       (PVOID*)&TrustInfo,   // buffer to receive data
       32000,                // recommended buffer size
       &ulReturned           // number of items returned in TrustInfo
    );

    // Check the return status for errors.
    if((Status != STATUS_SUCCESS) &&
       (Status != STATUS_MORE_ENTRIES) &&
     (Status != STATUS_NO_MORE_ENTRIES))
      {
        // Handle the error.
        wprintf(L"Error occurred enumerating domains %lu\n",
        LsaNtStatusToWinError(Status));
        return;
      } 

      wprintf(L"Status %lu\n", LsaNtStatusToWinError(Status));
      // Process the trusted domain information.
      for (i=0;i<ulReturned; i++) 
      {
        // LSA_Unicode strings might not be null-terminated.
        if(TrustInfo[i].Name.Length < 256)
        {
            wcsncpy_s(StringBuffer,
                256,
                TrustInfo[i].Name.Buffer,
                TrustInfo[i].Name.Length
            );
            // Guarantee that StringBuffer is null-terminated.
            StringBuffer[TrustInfo[i].Name.Length] = NULL; 
        }
        else
        {
            fprintf(stderr, "Name too long for string buffer.\n");
            exit(1);
        }
        
        wprintf(L"Enum Trusted Domain - %ws ", StringBuffer);
      }
      // Free the buffer.
      if (TrustInfo != NULL) 
      {
        LsaFreeMemory(TrustInfo);
        TrustInfo = NULL;
      }
    } while (Status != STATUS_NO_MORE_ENTRIES);
    return;
}