Call of CheckTokenMembership Always Fail (возвращаемое значение всегда False) - вызов из SCADA (Win CC) - PullRequest
0 голосов
/ 05 мая 2020
• 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

...