#include #include #include #include #include #include #include //for wmi object path parser #include #include #include using namespace std; #include "objpath.h" #include "debug.h" #include "utils.h" #include #include "utils.tmh" //////////////////////////////////////////////////////////////////////////////// // // CErrorWlbsControl::CErrorWlbsControl // // Purpose: This object is ultimately caught and used to send WLBS error codes // back to the user via an __ExtendedStatus object. Strings are not // sent back in release mode due to localization concerns. // //////////////////////////////////////////////////////////////////////////////// CErrorWlbsControl::CErrorWlbsControl ( DWORD a_dwError, WLBS_COMMAND a_CmdCommand, BOOL a_bAllClusterCall ) { #ifdef DBG static char* pszWlbsCommand[] = { "WlbsAddPortRule", "WlbsAddressToName", "WlbsAddressToString", "WlbsAdjust", "WlbsCommitChanges", "WlbsDeletePortRule", "WlbsDestinationSet", "WlbsDisable", "WlbsDrain", "WlbsDrainStop", "WlbsEnable", "WlbsFormatMessage", "WlbsGetEffectiveVersion", "WlbsGetNumPortRules", "WlbsEnumPortRules", "WlbsGetPortRule", "WlbsInit", "WlbsPasswordSet", "WlbsPortSet", "WlbsQuery", "WlbsReadReg", "WlbsResolve", "WlbsResume", "WlbsSetDefaults", "WlbsSetRemotePassword", "WlbsStart", "WlbsStop", "WlbsSuspend", "WlbsTimeoutSet", "WlbsWriteReg", "WlbsQueryPortState" }; char buf[512]; if (a_CmdCommand <= CmdWlbsWriteReg) { if (a_CmdCommand != CmdWlbsQuery || a_dwError != WLBS_TIMEOUT) { StringCbPrintfA(buf, sizeof(buf), "wlbsprov: %s failed, AllCluster = %d, error = %d\n", pszWlbsCommand[a_CmdCommand], (int)a_bAllClusterCall, a_dwError); } } else { StringCbPrintfA(buf, sizeof(buf), "wlbsprov: %d failed, AllCluster = %d, error = %d\n", a_CmdCommand, (int)a_bAllClusterCall, a_dwError); } OutputDebugStringA(buf); #endif WlbsFormatMessageWrapper( a_dwError, a_CmdCommand, a_bAllClusterCall, m_wstrDescription ); m_dwError = a_dwError; } //////////////////////////////////////////////////////////////////////////////// // // AddressToString // // Purpose: Converts a DWORD address to a wstring in dotted notation. This // function wraps the WlbsAddressToString function. // // //////////////////////////////////////////////////////////////////////////////// void AddressToString( DWORD a_dwAddress, wstring& a_szIPAddress ) { DWORD dwLenIPAddress = 32; WCHAR *szIPAddress = new WCHAR[dwLenIPAddress]; if( !szIPAddress ) throw _com_error( WBEM_E_OUT_OF_MEMORY ); try { for( short nTryTwice = 2; nTryTwice > 0; nTryTwice--) { if( ::WlbsAddressToString( a_dwAddress, szIPAddress, &dwLenIPAddress ) ) break; delete [] szIPAddress; szIPAddress = new WCHAR[dwLenIPAddress]; if( !szIPAddress ) throw _com_error( WBEM_E_OUT_OF_MEMORY ); } if( !nTryTwice ) throw _com_error( WBEM_E_FAILED ); a_szIPAddress = szIPAddress; if ( szIPAddress ) { delete [] szIPAddress; szIPAddress = NULL; } } catch(...) { if ( szIPAddress ) delete [] szIPAddress; throw; } } //////////////////////////////////////////////////////////////////////////////// // // CWmiWlbsCluster::FormatMessage // // Purpose: Obtains a descriptive string associated with a WLBS return value. // //////////////////////////////////////////////////////////////////////////////// void WlbsFormatMessageWrapper ( DWORD a_dwError, WLBS_COMMAND a_Command, BOOL a_bClusterWide, wstring& a_wstrMessage ) { DWORD dwBuffSize = 255; TCHAR* pszMessageBuff = new WCHAR[dwBuffSize]; if( !pszMessageBuff ) throw _com_error( WBEM_E_OUT_OF_MEMORY ); try { for( short nTryTwice = 2; nTryTwice > 0; nTryTwice-- ) { if( WlbsFormatMessage( a_dwError, a_Command, a_bClusterWide, pszMessageBuff, &dwBuffSize) ) break; delete [] pszMessageBuff; pszMessageBuff = new WCHAR[dwBuffSize]; if( !pszMessageBuff ) throw _com_error( WBEM_E_OUT_OF_MEMORY ); } if( !nTryTwice ) throw _com_error( WBEM_E_FAILED ); a_wstrMessage = pszMessageBuff; delete [] pszMessageBuff; } catch (...) { if( pszMessageBuff ) delete [] pszMessageBuff; throw; } } //////////////////////////////////////////////////////////////////////////////// // // ClusterStatusOK // // Purpose: // //////////////////////////////////////////////////////////////////////////////// BOOL ClusterStatusOK(DWORD a_dwStatus) { if( a_dwStatus > 0 && a_dwStatus <= WLBS_MAX_HOSTS ) return TRUE; switch( a_dwStatus ) { case WLBS_SUSPENDED: case WLBS_STOPPED: case WLBS_DRAINING: case WLBS_CONVERGING: case WLBS_CONVERGED: return TRUE; break; default: return FALSE; } } //////////////////////////////////////////////////////////////////////////////// // // Check_Load_Unload_Driver_Privilege // // Purpose: This function checks if the SE_LOAD_DRIVER_NAME (= "SeLoadDriverPrivilege") // is enabled in the impersonation access token. Ofcourse, this function // must be called AFTER impersonating the client. // //////////////////////////////////////////////////////////////////////////////// BOOL Check_Load_Unload_Driver_Privilege() { PRIVILEGE_SET PrivilegeSet; LUID Luid; BOOL bResult = FALSE; HANDLE TokenHandle = NULL; TRACE_INFO("->%!FUNC!"); // Look up the LUID for "SeLoadDriverPrivilege" if (!LookupPrivilegeValue(NULL, // lookup privilege on local system SE_LOAD_DRIVER_NAME, // "SeLoadDriverPrivilege" : Load and unload device drivers &Luid)) // receives LUID of privilege { TRACE_CRIT("%!FUNC! LookupPrivilegeValue error: %u", GetLastError()); TRACE_INFO("<-%!FUNC! Returning FALSE"); return FALSE; } // // Get a handle to the impersonation access token with TOKEN_QUERY right. // // Note: If this thread is NOT impersonating, then, the following call // will fail with ERROR_NO_TOKEN. // if (!OpenThreadToken(GetCurrentThread(), TOKEN_QUERY, FALSE, // Use the credentials of the client that is being impersonated &TokenHandle)) { TRACE_CRIT("%!FUNC! OpenThreadToken error: %u", GetLastError()); TRACE_INFO("<-%!FUNC! Returning FALSE"); return FALSE; } PrivilegeSet.PrivilegeCount = 1; PrivilegeSet.Control = PRIVILEGE_SET_ALL_NECESSARY; PrivilegeSet.Privilege[0].Luid = Luid; PrivilegeSet.Privilege[0].Attributes = 0; if (!PrivilegeCheck(TokenHandle, &PrivilegeSet, &bResult)) { bResult = FALSE; TRACE_CRIT("%!FUNC! PrivilegeCheck error: %u", GetLastError()); } CloseHandle(TokenHandle); TRACE_INFO(L"<-%!FUNC! Returning %ls", bResult ? L"TRUE" : L"FALSE"); return bResult; }