/*++ Copyright (C) 1997-2001 Microsoft Corporation Module Name: Abstract: History: --*/ // Utils.cpp #include "stdafx.h" #include "utils.h" #include HRESULT EnableAllPrivileges(DWORD dwTokenType) { // Open thread token // ================= HANDLE hToken = NULL; BOOL bRes; switch (dwTokenType) { case TOKEN_THREAD: bRes = OpenThreadToken(GetCurrentThread(), TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, TRUE, &hToken); break; case TOKEN_PROCESS: bRes = OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, &hToken); break; } if(!bRes) return WBEM_E_ACCESS_DENIED; // Get the privileges // ================== DWORD dwLen; TOKEN_USER tu; memset(&tu,0,sizeof(TOKEN_USER)); bRes = GetTokenInformation(hToken, TokenPrivileges, &tu, sizeof(TOKEN_USER), &dwLen); BYTE* pBuffer = new BYTE[dwLen]; if(pBuffer == NULL) { CloseHandle(hToken); return WBEM_E_OUT_OF_MEMORY; } bRes = GetTokenInformation(hToken, TokenPrivileges, pBuffer, dwLen, &dwLen); if(!bRes) { CloseHandle(hToken); delete [] pBuffer; return WBEM_E_ACCESS_DENIED; } // Iterate through all the privileges and enable them all // ====================================================== TOKEN_PRIVILEGES* pPrivs = (TOKEN_PRIVILEGES*)pBuffer; for(DWORD i = 0; i < pPrivs->PrivilegeCount; i++) { pPrivs->Privileges[i].Attributes |= SE_PRIVILEGE_ENABLED; } // Store the information back into the token // ========================================= bRes = AdjustTokenPrivileges(hToken, FALSE, pPrivs, 0, NULL, NULL); delete [] pBuffer; CloseHandle(hToken); if(!bRes) return WBEM_E_ACCESS_DENIED; else return WBEM_S_NO_ERROR; } BOOL GetFileVersion(LPCTSTR szFN, LPTSTR szVersion) { DWORD dwCount, dwHandle, dwValueLen; BOOL bRet; char *pcValue, *pc, *pBuffer, szFileName[MAX_PATH], szQuery[100]; lstrcpy(szFileName, szFN); if ((dwCount = GetFileVersionInfoSize(szFileName, &dwHandle)) != 0) { pBuffer = new char[dwCount]; if (!pBuffer) return FALSE; if (GetFileVersionInfo(szFileName, dwHandle, dwCount, pBuffer) != 0) { VerQueryValue(pBuffer, "\\VarFileInfo\\Translation", (void **) &pcValue, (UINT *) &dwValueLen); if (dwValueLen != 0) { wsprintf(szQuery, "\\StringFileInfo\\%04X%04X\\FileVersion", *(WORD *)pcValue, *(WORD *)(pcValue+2)); bRet = VerQueryValue(pBuffer, szQuery, (void **) &pcValue, (UINT *) &dwValueLen); if (bRet) { while ((pc = strchr(pcValue, '(')) != NULL) *pc = '{'; while ((pc = strchr(pcValue, ')')) != NULL) *pc = '}'; _tcscpy(szVersion, pcValue); delete pBuffer; return TRUE; } } } delete pBuffer; } return FALSE; } void SetSecurityHelper( IUnknown *pUnk, BSTR pAuthority, BSTR pUser, BSTR pPassword, DWORD dwImpLevel, DWORD dwAuthLevel) { BSTR pPrincipal = NULL; COAUTHIDENTITY *pAuthIdentity = NULL; SetInterfaceSecurityEx( pUnk, pAuthority, pUser, pPassword, dwAuthLevel, dwImpLevel, EOAC_NONE, &pAuthIdentity, &pPrincipal); if (pPrincipal) SysFreeString(pPrincipal); if (pAuthIdentity) WbemFreeAuthIdentity(pAuthIdentity); }