Открытие дескриптора объекта политики
Большинству функций политики LSA требуется дескриптор объекта Policy для запроса или изменения системой. Чтобы получить дескриптор объекта Policy , вызовите LsaOpenPolicy и укажите имя системы, к которой требуется доступ, и набор необходимых разрешений доступа.
Разрешения на доступ, необходимые для приложения, зависят от выполняемых им действий. Дополнительные сведения о разрешениях, необходимых для каждой функции, см. в описании этой функции в разделе Функции политики LSA.
Если вызов LsaOpenPolicy выполнен успешно, он возвращает дескриптор объекта Policy для указанной системы. Затем приложение передает этот дескриптор в последующих вызовах функции политики LSA. Если дескриптор больше не нужен приложению, оно должно вызвать LsaClose , чтобы освободить его.
В следующем примере показано, как открыть дескриптор объекта Policy .
#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, см. в описаниях функций, которым приложение будет передавать дескриптор объекта Policy .
Чтобы открыть дескриптор объекта Policy доверенного домена, вызовите LsaCreateTrustedDomainEx (чтобы создать новое отношение доверия с доменом) или вызовите LsaOpenTrustedDomainByName (для доступа к существующему доверенному домену). Обе эти функции задают указатель на LSA_HANDLE, который затем можно указать в последующих вызовах функций политики LSA. Как и в случае с LsaOpenPolicy, приложение должно вызывать LsaClose , когда ему больше не нужен дескриптор объекта Policy доверенного домена.