// RARegSetting.cpp : Implementation of CRARegSetting #include "stdafx.h" #include "RAssistance.h" #include "common.h" #include "RARegSetting.h" #include "assert.h" ///////////////////////////////////////////////////////////////////////////// // CRARegSetting STDMETHODIMP CRARegSetting::get_AllowGetHelpCPL(BOOL *pVal) { // Set default value; DWORD dwValue; *pVal = RA_CTL_RA_ENABLE_DEF_VALUE; HRESULT hr = RegGetDwValueCPL(RA_CTL_RA_ENABLE, &dwValue); if (hr == S_OK) { *pVal = !!dwValue; } return hr; } STDMETHODIMP CRARegSetting::get_AllowGetHelp(BOOL *pVal) { // Set default value; DWORD dwValue; *pVal = RA_CTL_RA_ENABLE_DEF_VALUE; HRESULT hr = RegGetDwValue(RA_CTL_RA_ENABLE, &dwValue); if (hr == S_OK) { *pVal = !!dwValue; } return hr; } STDMETHODIMP CRARegSetting::put_AllowGetHelp(BOOL newVal) { DWORD dwValue = newVal; HRESULT hr = RegSetDwValue(RA_CTL_RA_ENABLE, dwValue); return hr; } STDMETHODIMP CRARegSetting::get_AllowBuddyHelp(BOOL *pVal) { // Set default value; DWORD dwValue; *pVal = RA_CTL_ALLOW_BUDDYHELP_DEF_VALUE; HRESULT hr = RegGetDwValue(RA_CTL_ALLOW_BUDDYHELP, &dwValue); if (hr == S_OK) { *pVal = !!dwValue; } return hr; } STDMETHODIMP CRARegSetting::get_AllowUnSolicitedFullControl(BOOL *pVal) { // Set default value; DWORD dwValue; *pVal = RA_CTL_ALLOW_UNSOLICITEDFULLCONTROL_DEF_VALUE; HRESULT hr = RegGetDwValue(RA_CTL_ALLOW_UNSOLICITEDFULLCONTROL, &dwValue); if (hr == S_OK) { *pVal = !!dwValue; } return hr; } STDMETHODIMP CRARegSetting::get_AllowUnSolicited(BOOL *pVal) { // Set default value; DWORD dwValue; *pVal = RA_CTL_ALLOW_UNSOLICITED_DEF_VALUE; HRESULT hr = RegGetDwValue(RA_CTL_ALLOW_UNSOLICITED, &dwValue); if (hr == S_OK) { *pVal = !!dwValue; } return hr; } STDMETHODIMP CRARegSetting::put_AllowUnSolicited(BOOL newVal) { DWORD dwValue = newVal; HRESULT hr = RegSetDwValue(RA_CTL_ALLOW_UNSOLICITED, dwValue); return hr; } STDMETHODIMP CRARegSetting::get_AllowFullControl(BOOL *pVal) { // Set default value; DWORD dwValue; *pVal = RA_CTL_ALLOW_FULLCONTROL_DEF_VALUE; HRESULT hr = RegGetDwValue(RA_CTL_ALLOW_FULLCONTROL, &dwValue); if (hr == S_OK) { *pVal = !!dwValue; } return hr; } STDMETHODIMP CRARegSetting::put_AllowFullControl(BOOL newVal) { DWORD dwValue = newVal; HRESULT hr = RegSetDwValue(RA_CTL_ALLOW_FULLCONTROL, dwValue); return hr; } STDMETHODIMP CRARegSetting::get_MaxTicketExpiry(LONG *pVal) { // Set default value; DWORD dwUnit, dwValue; HRESULT hr = FALSE; DWORD dwSize = sizeof(DWORD), dwSize1 = sizeof(DWORD); HKEY hKey=NULL, hPolKey=NULL, hCtlKey=NULL; *pVal = RA_CTL_TICKET_EXPIRY_DEF_VALUE; // // Look up Group Policy settings first // RegOpenKeyEx(HKEY_LOCAL_MACHINE, REG_KEY_REMOTEASSISTANCE_GP, 0, KEY_READ, &hPolKey); // // look up Control Panel settings // RegOpenKeyEx(HKEY_LOCAL_MACHINE, REG_KEY_REMOTEASSISTANCE, 0, KEY_READ, &hCtlKey); // // Read the reg value if we could open the key // if (hPolKey) hKey = hPolKey; else if (hCtlKey) hKey = hCtlKey; while (hKey) { // Get value if (ERROR_SUCCESS == RegQueryValueEx(hKey, RA_CTL_TICKET_EXPIRY, 0, NULL, (LPBYTE)&dwValue, &dwSize) && ERROR_SUCCESS == RegQueryValueEx(hKey, RA_CTL_TICKET_EXPIRY_UNIT, 0, NULL, (LPBYTE)&dwUnit, &dwSize1)) { *pVal = dwValue * ((dwUnit==RA_IDX_MIN)?60:((dwUnit==RA_IDX_HOUR)?3600:86400)); // 0: minute 1: hour 2: day break; } else if (hPolKey == hKey) { // // Group Policy gets rid of the value if you disable the policy // Need to read the value from Control Panel settings. // assert(hCtlKey != hPolKey); hKey = hCtlKey; continue; } break; } if (hPolKey) RegCloseKey(hPolKey); if (hCtlKey) RegCloseKey(hCtlKey); return S_OK; } STDMETHODIMP CRARegSetting::put_MaxTicketExpiry(LONG newVal) { DWORD dwValue = newVal; DWORD dwUnit = -1, dwBase=0; RegGetDwValue(RA_CTL_TICKET_EXPIRY_UNIT, &dwUnit); if (dwUnit != -1) { dwBase = (dwUnit==0)?60:((dwUnit==1)?3600:86400); if (dwValue % dwBase == 0) // no need to change Unit { dwValue = dwValue/dwBase; goto set_value; } } if (dwValue % 86400 == 0) { dwValue /= 86400; dwUnit = RA_IDX_DAY; } else if (dwValue % 3600 == 0) { dwValue /= 3600; dwUnit = RA_IDX_HOUR; } dwValue = dwValue / 60 + ((dwValue % 60) > 0); // round to the next minutes dwUnit = RA_IDX_MIN; set_value: RegSetDwValue(RA_CTL_TICKET_EXPIRY, dwValue); RegSetDwValue(RA_CTL_TICKET_EXPIRY_UNIT, dwUnit); return S_OK; } STDMETHODIMP CRARegSetting::get_AllowRemoteAssistance(BOOL *pVal) { // Set default value; DWORD dwValue; *pVal = RA_CTL_RA_ENABLE_DEF_VALUE; HRESULT hr = RegGetDwValue(RA_CTL_RA_MODE, &dwValue); if (hr == S_OK) { *pVal = !!dwValue; } return hr; } STDMETHODIMP CRARegSetting::put_AllowRemoteAssistance(BOOL newVal) { DWORD dwValue = newVal; HRESULT hr = RegSetDwValue(RA_CTL_RA_MODE, dwValue); return hr; } /***************************************************************** Func: RegGetDwValueCPL() Abstract: Internal Helper function to retrieve RA setting values for Control Panel settings Return: DWORD value ******************************************************************/ HRESULT CRARegSetting::RegGetDwValueCPL(LPCTSTR valueName, DWORD* pdword) { HRESULT hr = S_FALSE; DWORD dwSize = sizeof(DWORD); HKEY hKey=NULL; // // look up Control Panel settings // if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, REG_KEY_REMOTEASSISTANCE, 0, KEY_READ, &hKey)) { // // Read the reg value if we could open the key // // Get value LONG lRetVal = RegQueryValueEx(hKey, valueName, 0, NULL, (LPBYTE)pdword, &dwSize ); hr = (lRetVal == ERROR_SUCCESS) ? S_OK : S_FALSE; } if (hKey) RegCloseKey(hKey); return hr; } /***************************************************************** Func: RegGetDwValue() Abstract: Internal Helper function to retrieve RA setting values Return: DWORD value ******************************************************************/ HRESULT CRARegSetting::RegGetDwValue(LPCTSTR valueName, DWORD* pdword) { HRESULT hr = S_FALSE; DWORD dwSize = sizeof(DWORD); HKEY hKey=NULL, hPolKey=NULL, hCtlKey=NULL; // // Look up Group Policy settings first // RegOpenKeyEx(HKEY_LOCAL_MACHINE, REG_KEY_REMOTEASSISTANCE_GP, 0, KEY_READ, &hPolKey); // // look up Control Panel settings // RegOpenKeyEx(HKEY_LOCAL_MACHINE, REG_KEY_REMOTEASSISTANCE, 0, KEY_READ, &hCtlKey); *pdword = 0; // // Read the reg value if we could open the key // if (hPolKey) hKey = hPolKey; else if (hCtlKey) hKey = hCtlKey; while (hKey) { // Get value LONG lRetVal = RegQueryValueEx(hKey, valueName, 0, NULL, (LPBYTE)pdword, &dwSize ); hr = (lRetVal == ERROR_SUCCESS) ? S_OK : S_FALSE; if (hr == S_FALSE && hPolKey == hKey) { // // Value not found in Group Policy // Need to read the value from Control Panel settings. // assert(hCtlKey != hPolKey); hKey = hCtlKey; continue; } break; } if (hPolKey) RegCloseKey(hPolKey); if (hCtlKey) RegCloseKey(hCtlKey); return hr; } /***************************************************************** Func: RegSetDwValue() Abstract: Internal Helper function to set RA setting values Return: DWORD value ******************************************************************/ HRESULT CRARegSetting::RegSetDwValue(LPCTSTR valueName, DWORD dwValue) { HRESULT hr = S_FALSE; DWORD dwSize = sizeof(DWORD); HKEY hKey = NULL; if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, REG_KEY_REMOTEASSISTANCE, 0, KEY_WRITE, &hKey)) { // Set Value if (ERROR_SUCCESS == RegSetValueEx(hKey,valueName,0,REG_DWORD,(LPBYTE)&dwValue,sizeof(DWORD))) { hr = S_OK; } RegCloseKey(hKey); } return hr; }