• 1000 аккаунт является членом определенной группы в Windows? ). Я разработал эту функцию в программном обеспечении Win CC, которое является системой scada.
Вот мой код:
//Insert the header starting here
#include "WinApi.h"
#include "GlobalDefinitions.h"
BOOL CheckGroupMembership(char* UserName, char* Password, char* Domain, char* Group)
{
HRESULT result;
SID_NAME_USE SIDType;
WCHAR szDomain[256];
DWORD dwSidSize=0;
DWORD dwSize;
HANDLE user;
BOOL b=FALSE,returnval;
SID* pSid;
WCHAR szGroup[50];
// Convertit le nom du groupe en wide string
result=MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,Group,strlen(Group),szGroup,50);
printf("Nom du groupe : %ls\r\n",szGroup);
//recupere SID groupe
//premier appel de lookup pour allouer la bonne taille de SID (remis à jour dans dwSidSize);
LookupAccountNameW(NULL,szGroup,NULL,&dwSidSize,szDomain,&dwSize,&SIDType);
if (dwSidSize)
{
pSid=(SID*)malloc(dwSidSize);
//note : pas besoin de lui fournir un domaine si la machine est déjà intégrée dedans
LookupAccountNameW(NULL,szGroup,pSid,&dwSidSize,szDomain,&dwSize,&SIDType);
printf("dwSidSize %d \r\n",dwSidSize);
printf("Infos SID : %x , %x, %x - %d \r\n", pSid->Revision,pSid->SubAuthorityCount,pSid->IdentifierAuthority,SIDType);
// Récupère le handle de l'utilisateur
returnval=LogonUserA(UserName,Domain,Password,2,0,&user);
printf("User %d - %x \r\n",user,returnval);
returnval=CheckTokenMembership(user,pSid,&b);
}
printf("returnval %d - b : %d - %d\r\n",returnval,b,GetLastError());
free(pSid);
return b;
}
Что бы я ни делал, возвращаемое значение вне CheckGroupMemberShip ложно. Я думаю, что LookupAccountNameW работает хорошо, если я помещаю допустимую группу, у меня есть достоверная информация в структуре SID. Если я помещаю группу, которой не существует, она просто дает мне нули.
Думаю, также LogonUserA работает очень хорошо, как будто я даю достоверную информацию, возвращаемое значение истинно, в противном случае - ложно.
Только checkGroupMembership, похоже, мне не отвечает.
Есть некоторые вещи, которые я не очень хорошо понимаю: Почему есть список SID для одной запрошенной группы, а не только для одной? Есть ли место, где я могу сравнить значения в структуре SID и SID, соответствующие существующей группе? Независимо от того, что я даю ему (группу или имя пользователя), кажется, что SIDType всегда одинаков на выходе LookupAccountNameW. Почему? Наконец, GetLastError мне не помогает. Он всегда дает мне 0, почему?
Обратите внимание: «WinApi.h» сделан на заказ, потому что я хотел импортировать только то, что было строго необходимо в моем приложении. Если вы думаете, что это может быть проблемой, я могу опубликовать его.
Заранее спасибо за ваши ответы,
Julien