LsaOpenPolicy

LsaOpenPolicy函数在本地或远程系统上打开策略对象的句柄。

您必须“作为管理员”运行进程,以便在ERROR_ACCESS_DENIED中调用不会失败。

语法:

NTSTATUS LsaOpenPolicy(

    PLSA_UNICODE_STRING SystemName,

    PLSA_OBJECT_ATTRIBUTES ObjectAttributes,

    ACCESS_MASK DesiredAccess,

    PLSA_HANDLE PolicyHandle

);

参数:

SystemName

指向包含目标系统名称的LSA_UNICODE_STRING结构的指针。名称可以是“ComputerName”或“\ComputerName”。如果该参数为空,则函数将在本地系统上打开策略对象。

ObjectAttributes

指向LSA_OBJECT_ATTRIBUTES结构的指针,该结构指定连接属性。不使用结构构件;将它们初始化为NULL或0。

DesiredAccess

一个ACCESS_MASK,它指定所请求的访问权限。如果目标系统的DACL不允许调用者访问请求,则该函数失败。要确定所需的访问权限,请参阅使用策略句柄的LSA函数的文档。

PolicyHandle

一个指向LSA_HANDLE变量的指针,该变量接收策略对象的句柄。

当您不再需要这个句柄时,将它传递给LsaClose函数以关闭它。

返回值:

如果函数成功,函数将返回STATUS_SUCCESS。

如果函数失败,则返回一个NTSTATUS代码。有关更多信息,请参见LSA策略函数返回值。

您可以使用LsaNtStatusToWinError 函数将NTSTATUS代码转换为Windows错误代码。

附注:

要管理本地或远程系统的本地安全策略,您必须调用LsaOpenPolicy函数,以使用该系统的LSA子系统建立会话。LsaOpenPolicy连接到目标系统的LSA,并向该系统的策略对象返回句柄。您可以在后续的LSA函数调用中使用此句柄来管理目标系统的本地安全策略信息。

要求:

下面的示例展示了如何打开策略对象句柄。

#include <windows.h>

#define TARGET_SYSTEM_NAME L"mysystem"

LSA_HANDLE GetPolicyHandle()
{
  LSA_OBJECT_ATTRIBUTES ObjectAttributes;
  WCHAR SystemName[] = TARGET_SYSTEM_NAME;
  USHORT SystemNameLength;
  LSA_UNICODE_STRING lusSystemName;
  NTSTATUS ntsResult;
  LSA_HANDLE lsahPolicyHandle;

  // Object attributes are reserved, so initialize to zeros.
  ZeroMemory(&ObjectAttributes, sizeof(ObjectAttributes));

  //Initialize an LSA_UNICODE_STRING to the server name.
  SystemNameLength = wcslen(SystemName);
  lusSystemName.Buffer = SystemName;
  lusSystemName.Length = SystemNameLength * sizeof(WCHAR);
  lusSystemName.MaximumLength = (SystemNameLength+1) * sizeof(WCHAR);

  // Get a handle to the Policy object.
  ntsResult = LsaOpenPolicy(
        &lusSystemName,    //Name of the target system.
        &ObjectAttributes, //Object attributes.
        POLICY_ALL_ACCESS, //Desired access permissions.
        &lsahPolicyHandle  //Receives the policy handle.
    );

  if (ntsResult != STATUS_SUCCESS)
  {
    // An error occurred. Display it as a win32 error code.
    wprintf(L"OpenPolicy returned %lu\n",
      LsaNtStatusToWinError(ntsResult));
    return NULL;
  } 
  return lsahPolicyHandle;
}

在前面的示例中,应用程序请求POLICY_ALL_ACCESS特权。有关在调用LsaOpenPolicy时应用程序应该请求的权限的详细信息,请参见应用程序将传递策略对象句柄的函数的描述。

要打开受信任域的策略对象的句柄,可以调用LsaCreateTrustedDomainEx(创建与域的新信任关系)或调用LsaOpenTrustedDomainByName(访问现有的受信任域)。这两个函数都设置了指向LSA_HANDLE的指针,然后可以在后续的LSA策略函数调用中指定该指针。与LsaOpenPolicy一样,当您的应用程序不再需要对受信任域的策略对象的句柄时,它应该调用LsaClose。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值