Acceda a la ubicación de escritura de infracción 0x00000000 cuando use LookupAccountName

Después de crear una cuenta de usuario con NetUserAdd , descubrí que necesitaría usar NetLocalGroupAddMembers para agregar al usuario al grupo de Usuarios, así que llamé a CreateWellKnownSid para obtener el SID de los Usuarios, LookupAccountSid para obtener el nombre de la cadena de ese SID y pasarlo a NetLocalGroupAddMembers.

También necesitaba especificar el nombre de usuario, pero la función requería el formato de dominio \ nombre como level 3 ( LOCALGROUP_MEMBERS_INFO_3 ), pero no tenía eso. Decidí llamar a LookupAccountName para obtener el nombre de usuario SID y pasarlo al level 0 ( LOCALGROUP_MEMBERS_INFO_0 ).

Así es como lo hice:

 //LocalAlloc UINT memAttributes = LMEM_FIXED; SIZE_T sidSize = SECURITY_MAX_SID_SIZE; //LookupAccountName PSID accountSID; SID_NAME_USE typeOfAccount; //NetLocalGroupAddMembers NET_API_STATUS localGroupAdd; DWORD levelOfData = 0; //LOCALGROUP_MEMBERS_INFO_0 LOCALGROUP_MEMBERS_INFO_0 localMembers; DWORD totalEntries = 0; //Allocate memory for LookupAccountName if (!(accountSID = LocalAlloc(memAttributes, sidSize))) { wprintf(L"\nMemory allocation for account SID failed: \n"); ShowError(GetLastError()); exit(1); } if (!LookupAccountNameW(NULL, argv[1], accountSID, (LPDWORD)&sidSize, NULL, 0, &typeOfAccount)) { fwprintf(stderr, L"Error getting SID from name: \n"); ShowError(GetLastError()); return 1; } //Here I should be able to use NetLocalGroupAddMembers //to add the user passed as argument to the Users group. localMembers.lgrmi0_sid = accountSID; localGroupAdd = NetLocalGroupAddMembers(NULL, name, levelOfData, (LPBYTE)&localMembers, totalEntries); if (localGroupAdd != NERR_Success) { fwprintf(stderr, L"Error adding member to the local group: \n"); ShowError(GetLastError()); return 1; } else { wprintf(L"\nUser %s has been successfully added.\n", argv[1]); } 

Este es el error que estoy recibiendo:

Excepción lanzada a 0x743F059A (sechost.dll) en UserCreator.exe: 0xC0000005: Ubicación de escritura de infracción de acceso 0x00000000.

¿Alguna pista?

¡Gracias de antemano!

El parámetro ReferencedDomainName no es realmente opcional.

 LPCTSTR machine = NULL, username = /*TEXT("Anders")*/ argv[1]; TCHAR domain[MAX_PATH]; BYTE accountSIDbuf[SECURITY_MAX_SID_SIZE]; PSID accountSID = (PSID) accountSIDbuf; DWORD cbSid = SECURITY_MAX_SID_SIZE, cchRD = MAX_PATH; SID_NAME_USE snu; if (!LookupAccountName(machine, username, accountSID, &cbSid, domain, &cchRD, &snu)) { printf("Error %u\n", GetLastError()); return ; } LPTSTR sidstr; if (!ConvertSidToStringSid(accountSID, &sidstr)) { return ; } _tprintf(_T("SID of %s\\%s is %s\n"), domain, username, sidstr); LocalFree(sidstr); 

Otro problema con su código es ShowError(GetLastError()); No puede usar GetLastError() después de llamar a otra función. Reescribir como

 DWORD error = GetLastError(); fwprintf(stderr, L"Error getting SID from name: \n"); ShowError(error); 

pero en este caso, incluso eso es incorrecto porque NetLocalGroupAddMembers no llama a SetLastError , simplemente devuelve el código de error directamente.

Editar:

Solo para aclarar el uso del parámetro; Si desea consultar el tamaño requerido del búfer de dominio, puede hacer esto:

 DWORD cchRD = 0; LookupAccountName(..., NULL, &cchRD, &snu); // The function is still going to report failure LPTSTR domain = malloc(cchRD * sizeof(*domain)); LookupAccountName(..., domain, &cchRD, &snu); 

En mi ejemplo, evito esto simplemente pasando un búfer que es “suficientemente grande”.