From: Tingzhong Luo luotingzhong@uniontech.com
Fix installer refuses to launch due to quering admin group failed via NetLocalGroupGetMembers failed
Signed-off-by: Tingzhong Luo luotingzhong@uniontech.com --- dlls/netapi32/netapi32.c | 46 ++++++++++++++++++++++++++++++++++++ dlls/netapi32/tests/access.c | 19 +++++++++++++++ 2 files changed, 65 insertions(+)
diff --git a/dlls/netapi32/netapi32.c b/dlls/netapi32/netapi32.c index 07f23e4bf93..8e0ba534ec1 100644 --- a/dlls/netapi32/netapi32.c +++ b/dlls/netapi32/netapi32.c @@ -2508,6 +2508,52 @@ NET_API_STATUS WINAPI NetLocalGroupGetMembers( *entriesread = 1; }
+ if (level == 1) + { + WCHAR userName[MAX_COMPUTERNAME_LENGTH + 1]; + DWORD userNameLen, domainNameLen, sidLen; + DWORD len,needlen; + PLOCALGROUP_MEMBERS_INFO_1 ptr; + SID_NAME_USE use; + + /* still a stub, current user is belonging to all groups */ + + *totalentries = 1; + *entriesread = 0; + + userNameLen = MAX_COMPUTERNAME_LENGTH + 1; + if (!GetUserNameW(userName,&userNameLen)) + return ERROR_NOT_ENOUGH_MEMORY; + + /* query length of sid for username */ + LookupAccountNameW(servername, userName, NULL, &sidLen, NULL, &domainNameLen, &use); + if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) + return GetLastError(); + + needlen = sizeof(LOCALGROUP_MEMBERS_INFO_1) + + (userNameLen+2) * sizeof(WCHAR) + + sizeof(sidLen); + + if (prefmaxlen != MAX_PREFERRED_LENGTH) + len = min(prefmaxlen,needlen); + else + len = needlen; + + NetApiBufferAllocate(len, (LPVOID *) bufptr); + if (len < needlen) + return ERROR_MORE_DATA; + + ptr = (PLOCALGROUP_MEMBERS_INFO_1)*bufptr; + ptr->lgrmi1_sid = (LPWSTR)(*bufptr+sizeof(LOCALGROUP_MEMBERS_INFO_1)); + ptr->lgrmi1_name = (LPWSTR)(*bufptr+sizeof(LOCALGROUP_MEMBERS_INFO_1) + sidLen); + lstrcpyW(ptr->lgrmi1_name, userName); + if (!LookupAccountNameW(servername, userName, ptr->lgrmi1_sid, &sidLen, NULL, &domainNameLen, &use)) + return GetLastError(); + ptr->lgrmi1_sidusage = use; + + *entriesread = 1; + } + return NERR_Success; }
diff --git a/dlls/netapi32/tests/access.c b/dlls/netapi32/tests/access.c index 5fdcb1573ea..63b10554f0e 100644 --- a/dlls/netapi32/tests/access.c +++ b/dlls/netapi32/tests/access.c @@ -26,6 +26,7 @@ #include <lmaccess.h> #include <lmerr.h> #include <lmapibuf.h> +#include <sddl.h>
#include "wine/test.h"
@@ -268,6 +269,7 @@ static void run_localgroupgetinfo_tests(void) NET_API_STATUS status; PLOCALGROUP_INFO_1 lgi = NULL; PLOCALGROUP_MEMBERS_INFO_3 buffer = NULL; + PLOCALGROUP_MEMBERS_INFO_1 bufinfo1 = NULL; DWORD entries_read = 0, total_entries =0; int i;
@@ -290,6 +292,23 @@ static void run_localgroupgetinfo_tests(void) trace("domain and name: %s\n", wine_dbgstr_w(buffer[i].lgrmi3_domainandname));
NetApiBufferFree(buffer); + + status = NetLocalGroupGetMembers(NULL, L"Administrators", 1, (BYTE **)&bufinfo1, + MAX_PREFERRED_LENGTH, &entries_read, &total_entries, NULL); + ok(status == NERR_Success, "NetLocalGroupGetMembers unexpectedly returned %ld\n", status); + ok(entries_read > 0 && total_entries > 0, "Amount of entries is unexpectedly 0\n"); + for(i=0;i<entries_read;i++) + { + PWSTR sidstr = NULL; + ok(bufinfo1[i].lgrmi1_sid != 0, "Sid of index %d is unexpectedly NULL\n", i); + ok(ConvertSidToStringSidW(bufinfo1[i].lgrmi1_sid, &sidstr), "ConvertSidToStringSidW failed for index %d\n", i); + trace("name: %s, usage: %x, sid: %s\n", wine_dbgstr_w(bufinfo1[i].lgrmi1_name), + bufinfo1[i].lgrmi1_sidusage, wine_dbgstr_w(sidstr)); + if (sidstr) + LocalFree(sidstr); + } + + NetApiBufferFree(bufinfo1); }
static void test_DavGetHTTPFromUNCPath(void)