From f33c3b723bef15c12aa19d7bf41e9d7c4fd49331 Mon Sep 17 00:00:00 2001 From: Louis Lenders Date: Tue, 23 Jun 2009 18:40:35 +0200 Subject: advapi32/tests: add some tests for LsaLookupNames2 (based on patch from Aric Stewart) --- dlls/advapi32/tests/lsa.c | 108 +++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 108 insertions(+), 0 deletions(-) diff --git a/dlls/advapi32/tests/lsa.c b/dlls/advapi32/tests/lsa.c index e69e4e1..82914d0 100644 --- a/dlls/advapi32/tests/lsa.c +++ b/dlls/advapi32/tests/lsa.c @@ -42,6 +42,8 @@ static NTSTATUS (WINAPI *pLsaFreeMemory)(PVOID); static NTSTATUS (WINAPI *pLsaOpenPolicy)(PLSA_UNICODE_STRING,PLSA_OBJECT_ATTRIBUTES,ACCESS_MASK,PLSA_HANDLE); static NTSTATUS (WINAPI *pLsaQueryInformationPolicy)(LSA_HANDLE,POLICY_INFORMATION_CLASS,PVOID*); static BOOL (WINAPI *pConvertSidToStringSidA)(PSID pSid, LPSTR *str); +static NTSTATUS (WINAPI *pLsaLookupNames2)(LSA_HANDLE policy, ULONG flags, ULONG count, PLSA_UNICODE_STRING names, + PLSA_REFERENCED_DOMAIN_LIST *domains, PLSA_TRANSLATED_SID2 *sids); static BOOL init(void) { @@ -53,6 +55,7 @@ static BOOL init(void) pLsaOpenPolicy = (void*)GetProcAddress(hadvapi32, "LsaOpenPolicy"); pLsaQueryInformationPolicy = (void*)GetProcAddress(hadvapi32, "LsaQueryInformationPolicy"); pConvertSidToStringSidA = (void*)GetProcAddress(hadvapi32, "ConvertSidToStringSidA"); + pLsaLookupNames2 = (void*)GetProcAddress(hadvapi32, "LsaLookupNames2"); if (pLsaClose && pLsaEnumerateAccountRights && pLsaFreeMemory && pLsaOpenPolicy && pLsaQueryInformationPolicy && pConvertSidToStringSidA) return TRUE; @@ -60,6 +63,22 @@ static BOOL init(void) return FALSE; } +static void get_sid_info(PSID psid, LPSTR *user, LPSTR *dom) +{ + static CHAR account[MAX_PATH]; + static CHAR domain[MAX_PATH]; + DWORD size, dom_size; + SID_NAME_USE use; + + *user = account; + *dom = domain; + + size = dom_size = MAX_PATH; + account[0] = '\0'; + domain[0] = '\0'; + LookupAccountSidA(NULL, psid, account, &size, domain, &dom_size, &use); +} + static void test_lsa(void) { NTSTATUS status; @@ -216,6 +235,94 @@ static void test_lsa(void) } } +static void test_LsaLookupNames2(void) +{ + NTSTATUS status; + LSA_HANDLE handle; + LSA_OBJECT_ATTRIBUTES object_attributes; + int len; + + if (!pLsaLookupNames2) + { + win_skip("LsaLookupNames2 not avaliable\n"); + return; + } + + if (PRIMARYLANGID(LANGIDFROMLCID(GetThreadLocale())) != LANG_ENGLISH) + { + skip("Non-english locale (skipping LsaLookupNames2 tests)\n"); + return; + } + + ZeroMemory(&object_attributes, sizeof(object_attributes)); + object_attributes.Length = sizeof(object_attributes); + + status = pLsaOpenPolicy( NULL, &object_attributes, POLICY_ALL_ACCESS, &handle); + ok(status == STATUS_SUCCESS || status == STATUS_ACCESS_DENIED, + "LsaOpenPolicy(POLICY_ALL_ACCESS) returned 0x%08x\n", status); + + /* try a more restricted access mask if necessary */ + if (status == STATUS_ACCESS_DENIED) { + trace("LsaOpenPolicy(POLICY_ALL_ACCESS) failed, trying POLICY_VIEW_LOCAL_INFORMATION\n"); + status = pLsaOpenPolicy( NULL, &object_attributes, POLICY_LOOKUP_NAMES, &handle); + ok(status == STATUS_SUCCESS, "LsaOpenPolicy(POLICY_VIEW_LOCAL_INFORMATION) returned 0x%08x\n", status); + } + + if (status == STATUS_SUCCESS) { + static const WCHAR n1[] = {'L','O','C','A','L',' ','S','E','R','V','I','C','E',0}; + static const WCHAR n2[] = {'B','O','G','U','S',0}; + + PLSA_REFERENCED_DOMAIN_LIST domains = NULL; + PLSA_TRANSLATED_SID2 sids = NULL; + LSA_UNICODE_STRING name[2]; + LPSTR account, sid_dom; + + len = (lstrlenW(n1) + 1) * sizeof(WCHAR); + name[0].Buffer = HeapAlloc( GetProcessHeap(), 0, len ); + memcpy( name[0].Buffer, n1, len ); + name[0].MaximumLength = len; + name[0].Length = len - sizeof(WCHAR); + + len = (lstrlenW(n2) + 1) * sizeof(WCHAR); + name[1].Buffer = HeapAlloc( GetProcessHeap(), 0, len ); + memcpy( name[1].Buffer, n2, len ); + name[1].MaximumLength = len; + name[1].Length = len - sizeof(WCHAR); + + status = pLsaLookupNames2(handle, 0, 1, &name[1], &domains, &sids); + ok(status == STATUS_NONE_MAPPED, "status not STATUS_NONE_MAPPED (%x)\n",status); + ok(sids[0].Use == SidTypeUnknown,"Incorrect use\n"); + + pLsaFreeMemory(sids); + pLsaFreeMemory(domains); + + status = pLsaLookupNames2(handle, 0, 1, &name[0], &domains, &sids); + ok(status == STATUS_SUCCESS,"status not STATUS_SUCCESS (%x)\n",status); + ok(sids[0].Use == SidTypeWellKnownGroup,"Incorrect use\n"); + + get_sid_info(sids[0].Sid, &account, &sid_dom); + + ok(strcmp(account,"LOCAL SERVICE")==0,"Incorrect Sid Account\n"); + ok(strcmp(sid_dom,"NT AUTHORITY")==0,"Incorrect Sid Domain\n"); + + ok(sids[0].DomainIndex == 0, "Incorrect domain index\n"); + ok(domains->Entries == 1, "Incorrect # of domain entries \n"); + + get_sid_info(domains->Domains[0].Sid, &account, &sid_dom); + + todo_wine ok(strcmp(account,"NT Pseudo Domain")==0,"Incorrect domain sid account\n"); + todo_wine ok(strcmp(sid_dom,"NT Pseudo Domain")==0,"Incorrect domain sid domain\n"); + + HeapFree(GetProcessHeap(),0,name[0].Buffer); + HeapFree(GetProcessHeap(),0,name[1].Buffer); + pLsaFreeMemory(sids); + pLsaFreeMemory(domains); + + status = pLsaClose(handle); + ok(status == STATUS_SUCCESS, "LsaClose() failed, returned 0x%08x\n", status); + } +} + START_TEST(lsa) { if (!init()) { @@ -224,4 +331,5 @@ START_TEST(lsa) } test_lsa(); + test_LsaLookupNames2(); } -- 1.6.0.4