Определение групп пользователей в C++
В диспетчере авторизации объект IAzApplicationGroup представляет группу пользователей. Затем роли можно назначить этой группе пользователей совместно. Объект IAzApplicationGroup также может включать другие объекты IAzApplicationGroup в качестве членов. Дополнительные сведения о группах приложений см. в разделе Пользователи и группы.
Группу можно определить с помощью явных списков членов и элементов, не являющихся членами, или с помощью запроса LDAP. В следующих примерах показано, как создать каждый тип группы приложений:
Создание базовой группы
Базовая группа приложений определяется элементами, включенными в свойства Members и NonMembers объекта IAzApplicationGroup , представляющего группу. Пользователи и группы, перечисленные в свойстве Members , включаются в группу приложений, а пользователи и группы, перечисленные в свойстве NonMembers , исключаются из группы приложений. Если в свойстве NonMembers указано значение, вместо значения, указанного в свойстве Members .
В следующем примере показано, как создать базовую группу приложений и добавить всех локальных пользователей в качестве участников этой группы. В примере предполагается, что в корневом каталоге диска C имеется хранилище политик XML с именем MyStore.xml.
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0502
#endif
#pragma comment(lib, "duser.lib")
#include <windows.h>
#include <stdio.h>
#include <azroles.h>
#include <objbase.h>
void main(void){
IAzAuthorizationStore* pStore = NULL;
IAzApplicationGroup* pAppGroup = NULL;
HRESULT hr;
void MyHandleError(char *s);
BSTR storeName = NULL;
BSTR groupName = NULL;
BSTR sidString = NULL;
// Initialize COM.
hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
if (!(SUCCEEDED(hr)))
MyHandleError("Could not initialize COM.");
// Create the AzAuthorizationStore object.
hr = CoCreateInstance(
/*"b2bcff59-a757-4b0b-a1bc-ea69981da69e"*/
__uuidof(AzAuthorizationStore),
NULL,
CLSCTX_ALL,
/*"edbd9ca9-9b82-4f6a-9e8b-98301e450f14"*/
__uuidof(IAzAuthorizationStore),
(void**)&pStore);
if (!(SUCCEEDED(hr)))
MyHandleError("Could not create AzAuthorizationStore object.");
// Create null VARIANT for parameters.
VARIANT myVar;
VariantInit(&myVar);
// Allocate a string for the name of the store.
if(!(storeName = SysAllocString(L"msxml://c:\\MyStore.xml")))
MyHandleError("Could not allocate string.");
// Initialize the store.
hr = pStore->Initialize(AZ_AZSTORE_FLAG_MANAGE_STORE_ONLY,
storeName, myVar);
if (!(SUCCEEDED(hr)))
MyHandleError("Could not initialize store.");
// Create an application group object.
if (!(groupName = SysAllocString(L"Trusted Users")))
MyHandleError("Could not allocate group name string");
hr = pStore->CreateApplicationGroup(groupName, myVar, &pAppGroup);
if (!(SUCCEEDED(hr)))
MyHandleError("Could not create application group.");
// Add well-known SID for all local users to the group.
if (!(sidString = SysAllocString(L"S-1-2-0")))
MyHandleError("Could not allocate SID string name");
hr = pAppGroup->AddMember(sidString, myVar);
if (!(SUCCEEDED(hr)))
MyHandleError("Could not add member to group");
// Save changes to the store.
pAppGroup->Submit(0, myVar);
// Clean up resources.
pStore->Release();
pAppGroup->Release();
SysFreeString(storeName);
SysFreeString(groupName);
SysFreeString(sidString);
VariantClear(&myVar);
CoUninitialize();
}
void MyHandleError(char *s)
{
printf("An error occurred in running the program.\n");
printf("%s\n",s);
printf("Error number %x\n.",GetLastError());
printf("Program terminating.\n");
exit(1);
}
Создание группы запросов LDAP
Членство в группе запросов LDAP определяется запросом, содержащимся в значении ее свойства LdapQuery .
В следующем примере показано, как создать группу приложений запросов LDAP и добавить всех пользователей в качестве членов этой группы. В примере предполагается, что в корневом каталоге диска C имеется хранилище политик XML с именем MyStore.xml.
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0502
#endif
#pragma comment(lib, "duser.lib")
#include <windows.h>
#include <stdio.h>
#include <azroles.h>
#include <objbase.h>
void main(void){
IAzAuthorizationStore* pStore = NULL;
IAzApplicationGroup* pAppGroup = NULL;
HRESULT hr;
void MyHandleError(char *s);
BSTR storeName = NULL;
BSTR groupName = NULL;
BSTR ldapString = NULL;
// Initialize COM.
hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
if (!(SUCCEEDED(hr)))
MyHandleError("Could not initialize COM.");
// Create the AzAuthorizationStore object.
hr = CoCreateInstance(
/*"b2bcff59-a757-4b0b-a1bc-ea69981da69e"*/
__uuidof(AzAuthorizationStore),
NULL,
CLSCTX_ALL,
/*"edbd9ca9-9b82-4f6a-9e8b-98301e450f14"*/
__uuidof(IAzAuthorizationStore),
(void**)&pStore);
if (!(SUCCEEDED(hr)))
MyHandleError("Could not create AzAuthorizationStore object.");
VARIANT myVar;
myVar.vt = VT_NULL;
// Allocate a string for the name of the store.
if(!(storeName = SysAllocString(L"msxml://c:\\MyStore.xml")))
MyHandleError("Could not allocate string.");
// Initialize the store.
hr = pStore->Initialize(AZ_AZSTORE_FLAG_MANAGE_STORE_ONLY,
storeName, myVar);
if (!(SUCCEEDED(hr)))
MyHandleError("Could not initialize store.");
// Create an application group object.
if (!(groupName = SysAllocString(L"Trusted Users3")))
MyHandleError("Could not allocate group name string");
hr = pStore->CreateApplicationGroup(groupName, myVar, &pAppGroup);
if (!(SUCCEEDED(hr)))
MyHandleError("Could not create application group.");
// Set the Type property to AZ_GROUPTYPE_LDAP_QUERY.
hr = pAppGroup->put_Type(AZ_GROUPTYPE_LDAP_QUERY);
if (!(SUCCEEDED(hr)))
MyHandleError("Error changing type to LDAP query");
// Add LDAP query for all users.
if (!(ldapString =
SysAllocString(L"(&(objectCategory=person)(objectClass=user))")))
MyHandleError("Could not allocate LDAP query string");
hr = pAppGroup->put_LdapQuery(ldapString);
if (!(SUCCEEDED(hr)))
MyHandleError("Could not add query to group");
// Save changes to the store.
hr = pAppGroup->Submit(0, myVar);
if (!(SUCCEEDED(hr)))
MyHandleError("Could not save changes to store.");
// Clean up resources.
pStore->Release();
pAppGroup->Release();
SysFreeString(storeName);
SysFreeString(groupName);
SysFreeString(ldapString);
CoUninitialize();
}
void MyHandleError(char *s)
{
printf("An error occurred in running the program.\n");
printf("%s\n",s);
printf("Error number %x\n.",GetLastError());
printf("Program terminating.\n");
exit(1);
}