Module: wine Branch: master Commit: 38aa71b2c6eaa27b8760d0c66d4bc7bcdb5ef82a URL: http://source.winehq.org/git/wine.git/?a=commit;h=38aa71b2c6eaa27b8760d0c66d...
Author: Francois Gouget fgouget@codeweavers.com Date: Wed Mar 5 11:14:10 2014 +0100
msi/tests: Skip some package tests if in a non-administrator, non-power user account.
---
dlls/msi/tests/package.c | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-)
diff --git a/dlls/msi/tests/package.c b/dlls/msi/tests/package.c index 935a0fd..d5c37ea 100644 --- a/dlls/msi/tests/package.c +++ b/dlls/msi/tests/package.c @@ -41,6 +41,7 @@ static UINT (WINAPI *pMsiApplyMultiplePatchesA)(LPCSTR, LPCSTR, LPCSTR); static INSTALLSTATE (WINAPI *pMsiGetComponentPathExA)(LPCSTR, LPCSTR, LPCSTR, MSIINSTALLCONTEXT, LPSTR, LPDWORD); static HRESULT (WINAPI *pSHGetFolderPathA)(HWND, int, HANDLE, DWORD, LPSTR);
+static BOOL (WINAPI *pCheckTokenMembership)(HANDLE,PSID,PBOOL); static BOOL (WINAPI *pConvertSidToStringSidA)(PSID, LPSTR*); static BOOL (WINAPI *pOpenProcessToken)( HANDLE, DWORD, PHANDLE ); static LONG (WINAPI *pRegDeleteKeyExA)(HKEY, LPCSTR, REGSAM, DWORD); @@ -68,6 +69,7 @@ static void init_functionpointers(void) GET_PROC(hmsi, MsiGetComponentPathExA); GET_PROC(hshell32, SHGetFolderPathA);
+ GET_PROC(hadvapi32, CheckTokenMembership); GET_PROC(hadvapi32, ConvertSidToStringSidA); GET_PROC(hadvapi32, OpenProcessToken); GET_PROC(hadvapi32, RegDeleteKeyExA) @@ -85,9 +87,38 @@ static void init_functionpointers(void)
static BOOL is_process_limited(void) { + SID_IDENTIFIER_AUTHORITY NtAuthority = {SECURITY_NT_AUTHORITY}; + PSID Group; + BOOL IsInGroup; HANDLE token;
- if (!pOpenProcessToken) return FALSE; + if (!pCheckTokenMembership || !pOpenProcessToken) return FALSE; + + if (!AllocateAndInitializeSid(&NtAuthority, 2, SECURITY_BUILTIN_DOMAIN_RID, + DOMAIN_ALIAS_RID_ADMINS, + 0, 0, 0, 0, 0, 0, &Group) || + !pCheckTokenMembership(NULL, Group, &IsInGroup)) + { + trace("Could not check if the current user is an administrator\n"); + return FALSE; + } + if (!IsInGroup) + { + if (!AllocateAndInitializeSid(&NtAuthority, 2, + SECURITY_BUILTIN_DOMAIN_RID, + DOMAIN_ALIAS_RID_POWER_USERS, + 0, 0, 0, 0, 0, 0, &Group) || + !pCheckTokenMembership(NULL, Group, &IsInGroup)) + { + trace("Could not check if the current user is a power user\n"); + return FALSE; + } + if (!IsInGroup) + { + /* Only administrators and power users can be powerful */ + return TRUE; + } + }
if (pOpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &token)) {