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。