#include "pch.h" #pragma hdrstop #include #include "netoc.h" #include "ncreg.h" #include "snmpocx.h" // Allocates an admin ACL to be used with security descriptor PACL AllocACL() { PACL pAcl = NULL; PSID pSidAdmins = NULL; SID_IDENTIFIER_AUTHORITY Authority = SECURITY_NT_AUTHORITY; EXPLICIT_ACCESS ea[1]; // Create a SID for the BUILTIN\Administrators group. if ( !AllocateAndInitializeSid( &Authority, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &pSidAdmins )) { return NULL; } // Initialize an EXPLICIT_ACCESS structure for an ACE. ZeroMemory(&ea, 1 * sizeof(EXPLICIT_ACCESS)); // The ACE will allow the Administrators group full access to the key. ea[0].grfAccessPermissions = KEY_ALL_ACCESS; ea[0].grfAccessMode = SET_ACCESS; ea[0].grfInheritance= NO_INHERITANCE; ea[0].Trustee.TrusteeForm = TRUSTEE_IS_SID; ea[0].Trustee.TrusteeType = TRUSTEE_IS_GROUP; ea[0].Trustee.ptstrName = (LPTSTR) pSidAdmins; // Create a new ACL that contains the new ACEs. if (SetEntriesInAcl(1, ea, NULL, &pAcl) != ERROR_SUCCESS) { TraceError( "SetEntriesInAcl Error", GetLastError() ); FreeSid(pSidAdmins); return NULL; } FreeSid(pSidAdmins); return pAcl; } // frees a ACL void FreeACL( PACL pAcl) { if (pAcl != NULL) LocalFree(pAcl); } HRESULT SnmpAddAdminAclToKey(PWSTR pwszKey) { HKEY hKey = NULL; HRESULT hr; PACL pAcl = NULL; SECURITY_DESCRIPTOR S_Desc; if (pwszKey == NULL) return S_FALSE; // open registy key hr = HrRegOpenKeyEx(HKEY_LOCAL_MACHINE, pwszKey, // subkey name KEY_ALL_ACCESS, // want WRITE_DAC, &hKey // handle to open key ); if (hr != S_OK) { TraceError("SnmpAddAdminDaclToKey::HrRegOpenKeyEx", hr); return hr; } // Initialize a security descriptor. if (InitializeSecurityDescriptor (&S_Desc, SECURITY_DESCRIPTOR_REVISION) == 0) { RegSafeCloseKey(hKey); TraceError("SnmpAddAdminDaclToKey::InitializeSecurityDescriptor", GetLastError()); return S_FALSE; } // get the ACL and put it into the security descriptor if ( (pAcl = AllocACL()) != NULL ) { if (!SetSecurityDescriptorDacl (&S_Desc, TRUE, pAcl, FALSE)) { FreeACL(pAcl); RegSafeCloseKey(hKey); TraceError("SnmpAddAdminDaclToKey::SetSecurityDescriptorDacl Failed.", GetLastError()); return S_FALSE; } } else { RegSafeCloseKey(hKey); TraceError("SnmpAddAdminAclToKey::AllocACL Failed.", GetLastError()); return S_FALSE; } if (RegSetKeySecurity (hKey, DACL_SECURITY_INFORMATION, &S_Desc) != ERROR_SUCCESS) { FreeACL(pAcl); RegSafeCloseKey(hKey); TraceError("SnmpAddAdminDaclToKey::RegSetKeySecurity", GetLastError()); return S_FALSE; } FreeACL(pAcl); RegSafeCloseKey(hKey); return S_OK; } HRESULT SnmpRegWriteDword(PWSTR pszRegKey, PWSTR pszValueName, DWORD dwValueData) { HRESULT hr; HKEY hKey; hr = HrRegCreateKeyEx(HKEY_LOCAL_MACHINE, pszRegKey, 0, KEY_QUERY_VALUE | KEY_SET_VALUE, NULL, &hKey, NULL); if (hr != S_OK) { return hr; } hr = HrRegSetDword(hKey, pszValueName, dwValueData); RegSafeCloseKey(hKey); return hr; } HRESULT SnmpRegUpgEnableAuthTraps() { HRESULT hr = S_OK; HKEY hKey; // open the ..SNMP\Parameters registry key hr = HrRegOpenKeyEx(HKEY_LOCAL_MACHINE, REG_KEY_AUTHENTICATION_TRAPS, KEY_QUERY_VALUE, &hKey); // if successful, look for EnableAuthenticationTrap switch // in the old registry location if (hr == S_OK) { DWORD dwAuthTrap; // get the value of the old 'switch' parameter hr = HrRegQueryDword(hKey, REG_VALUE_SWITCH, &dwAuthTrap); // if successful transfer the value to the new location // if this fails, it means the SNMP service worked with the default value // which is already installed through the inf file. if (hr == S_OK) { hr = SnmpRegWriteDword(REG_KEY_SNMP_PARAMETERS, REG_VALUE_AUTHENTICATION_TRAPS, dwAuthTrap); } // close and delete the old registry key as it is obsolete RegSafeCloseKey(hKey); HrRegDeleteKey (HKEY_LOCAL_MACHINE, REG_KEY_AUTHENTICATION_TRAPS); } return hr; } HRESULT SnmpRegWriteCommunities(PWSTR pszCommArray) { HRESULT hr; HKEY hKey; PWSTR pszComm, pszAccess; DWORD dwAccess; hr = HrRegDeleteKey(HKEY_LOCAL_MACHINE, REG_KEY_VALID_COMMUNITIES); if (hr != S_OK) { return hr; } hr = HrRegCreateKeyEx(HKEY_LOCAL_MACHINE, REG_KEY_VALID_COMMUNITIES, 0, KEY_QUERY_VALUE | KEY_SET_VALUE, NULL, &hKey, NULL); if (hr != S_OK) { return hr; } pszComm = pszCommArray; while (*pszComm != L'\0') { dwAccess = SEC_READ_ONLY_VALUE; pszAccess = wcschr(pszComm, L':'); if (pszAccess != NULL) { *pszAccess = L'\0'; pszAccess++; if (_wcsicmp(pszAccess, SEC_NONE_NAME)==0) { dwAccess = SEC_NONE_VALUE; } if (_wcsicmp(pszAccess, SEC_NOTIFY_NAME)==0) { dwAccess = SEC_NOTIFY_VALUE; } if (_wcsicmp(pszAccess, SEC_READ_ONLY_NAME)==0) { dwAccess = SEC_READ_ONLY_VALUE; } if (_wcsicmp(pszAccess, SEC_READ_WRITE_NAME)==0) { dwAccess = SEC_READ_WRITE_VALUE; } if (_wcsicmp(pszAccess, SEC_READ_CREATE_NAME)==0) { dwAccess = SEC_READ_CREATE_VALUE; } } hr = HrRegSetDword(hKey, pszComm, dwAccess); if (hr != S_OK) { break; } if (pszAccess != NULL) { pszComm = pszAccess; } pszComm += (wcslen(pszComm) + 1); } RegSafeCloseKey(hKey); return hr; } HRESULT SnmpRegWriteDefCommunity() { HRESULT hr; HKEY hKey; hr = HrRegCreateKeyEx(HKEY_LOCAL_MACHINE, REG_KEY_VALID_COMMUNITIES, 0, KEY_QUERY_VALUE | KEY_SET_VALUE, NULL, &hKey, NULL); if (hr != S_OK) { return hr; } hr = HrRegSetDword(hKey, SEC_DEF_COMM_NAME, SEC_DEF_COMM_VALUE); RegSafeCloseKey(hKey); return hr; } HRESULT SnmpRegWritePermittedMgrs(BOOL bAnyHost, PWSTR pMgrsList) { HRESULT hr; HKEY hKey; UINT nMgr = 1; WCHAR szMgr[16]; hr = HrRegDeleteKey(HKEY_LOCAL_MACHINE, REG_KEY_PERMITTED_MANAGERS); if (hr != S_OK) { return hr; } hr = HrRegCreateKeyEx(HKEY_LOCAL_MACHINE, REG_KEY_PERMITTED_MANAGERS, 0, KEY_QUERY_VALUE | KEY_SET_VALUE, NULL, &hKey, NULL); if (hr != S_OK || bAnyHost) { return hr; } while(*pMgrsList != L'\0') { swprintf(szMgr, L"%d", nMgr++); hr = HrRegSetSz(hKey, szMgr, pMgrsList); if (hr != S_OK) break; pMgrsList += wcslen(pMgrsList) + 1; } RegSafeCloseKey(hKey); return hr; } HRESULT SnmpRegWriteTraps(tstring tstrVariable, PWSTR pTstrArray) { HKEY hKey, hKeyTrap; HRESULT hr = S_OK; UINT nTrap = 1; WCHAR szTrap[16]; hr = HrRegDeleteKeyTree(HKEY_LOCAL_MACHINE, REG_KEY_TRAP_DESTINATIONS); if (hr != S_OK) return hr; hr = HrRegCreateKeyEx(HKEY_LOCAL_MACHINE, REG_KEY_TRAP_DESTINATIONS, 0, KEY_QUERY_VALUE | KEY_SET_VALUE, NULL, &hKey, NULL); if (hr != S_OK) return hr; hr = HrRegCreateKeyEx(hKey, tstrVariable.c_str(), 0, KEY_QUERY_VALUE | KEY_SET_VALUE, NULL, &hKeyTrap, NULL); if (hr == S_OK) { // it might just happen that you want to create a // community but you don't have the trap destination // addresses yet. We should let this happen. if (pTstrArray != NULL) { while(*pTstrArray != L'\0') { swprintf(szTrap, L"%d", nTrap++); hr = HrRegSetSz(hKeyTrap, szTrap, pTstrArray); if (hr != S_OK) break; pTstrArray += wcslen(pTstrArray) + 1; } } RegSafeCloseKey(hKeyTrap); } RegSafeCloseKey(hKey); return hr; } HRESULT SnmpRegWriteTstring(PWSTR pRegKey, PWSTR pValueName, tstring tstrValueData) { HRESULT hr = S_OK; HKEY hKey; hr = HrRegCreateKeyEx(HKEY_LOCAL_MACHINE, pRegKey, 0, KEY_QUERY_VALUE | KEY_SET_VALUE, NULL, &hKey, NULL); if (hr != S_OK) return hr; hr = HrRegSetString(hKey, pValueName, tstrValueData); RegSafeCloseKey(hKey); return hr; } DWORD SnmpStrArrayToServices(PWSTR pSrvArray) { DWORD dwServices = 0; while(*pSrvArray) { if(_wcsicmp(pSrvArray, SRV_AGNT_PHYSICAL_NAME)==0) dwServices |= SRV_AGNT_PHYSICAL_VALUE; if(_wcsicmp(pSrvArray, SRV_AGNT_DATALINK_NAME)==0) dwServices |= SRV_AGNT_DATALINK_VALUE; if(_wcsicmp(pSrvArray, SRV_AGNT_ENDTOEND_NAME)==0) dwServices |= SRV_AGNT_ENDTOEND_VALUE; if(_wcsicmp(pSrvArray, SRV_AGNT_INTERNET_NAME)==0) dwServices |= SRV_AGNT_INTERNET_VALUE; if(_wcsicmp(pSrvArray, SRV_AGNT_APPLICATIONS_NAME)==0) dwServices |= SRV_AGNT_APPLICATIONS_VALUE; pSrvArray += wcslen(pSrvArray) + 1; } return dwServices; }