|
|
/*++
Copyright (C) 1997-2001 Microsoft Corporation
Module Name:
Abstract:
History:
--*/
// Utils.cpp
#include "stdafx.h"
#include "utils.h"
#include <cominit.h>
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); }
|