//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1997. // // File: N E T O C X . C P P // // Contents: Custom installation functions for various optional // components. // // Notes: // // Author: danielwe 19 Jun 1997 // //---------------------------------------------------------------------------- #include "pch.h" #pragma hdrstop #include "netoc.h" #include "netocx.h" #include "ncmisc.h" #include "ncreg.h" #include "ncsetup.h" #include "ncsvc.h" #include "snmpocx.h" static const WCHAR c_szFileSpec[] = L"*.*"; static const WCHAR c_szWinsPath[] = L"\\wins"; static const WCHAR c_szRegKeyWinsParams[] = L"System\\CurrentControlSet\\Services\\WINS\\Parameters"; static const WCHAR c_szRegValWinsBackupDir[] = L"BackupDirPath"; //+--------------------------------------------------------------------------- // // Function: HrOcExtWINS // // Purpose: NetOC external message handler // // Arguments: // pnocd [] // uMsg [] // wParam [] // lParam [] // // Returns: // // Author: danielwe 17 Sep 1998 // // Notes: // HRESULT HrOcExtWINS(PNETOCDATA pnocd, UINT uMsg, WPARAM wParam, LPARAM lParam) { HRESULT hr = S_OK; Assert(pnocd); switch (uMsg) { case NETOCM_POST_INSTALL: hr = HrOcWinsOnInstall(pnocd); break; } TraceError("HrOcExtWINS", hr); return hr; } //+--------------------------------------------------------------------------- // // Function: HrOcExtDNS // // Purpose: NetOC external message handler // // Arguments: // pnocd [] // uMsg [] // wParam [] // lParam [] // // Returns: // // Author: danielwe 17 Sep 1998 // // Notes: // HRESULT HrOcExtDNS(PNETOCDATA pnocd, UINT uMsg, WPARAM wParam, LPARAM lParam) { HRESULT hr = S_OK; Assert(pnocd); switch (uMsg) { case NETOCM_POST_INSTALL: hr = HrOcDnsOnInstall(pnocd); break; } TraceError("HrOcExtDNS", hr); return hr; } //+--------------------------------------------------------------------------- // // Function: HrOcExtSNMP // // Purpose: NetOC external message handler // // Arguments: // pnocd [] // uMsg [] // wParam [] // lParam [] // // Returns: // // Author: danielwe 17 Sep 1998 // // Notes: // HRESULT HrOcExtSNMP(PNETOCDATA pnocd, UINT uMsg, WPARAM wParam, LPARAM lParam) { HRESULT hr = S_OK; Assert(pnocd); switch (uMsg) { case NETOCM_POST_INSTALL: hr = HrOcSnmpOnInstall(pnocd); break; } TraceError("HrOcExtSNMP", hr); return hr; } //+--------------------------------------------------------------------------- // // Function: HrSetWinsServiceRecoveryOption // // Purpose: Sets the recovery options for the WINS service // // Arguments: // pnocd [in] Pointer to NETOC data. // // Returns: S_OK if successful, Win32 error otherwise. // // Author: danielwe 26 May 1999 // // Notes: // HRESULT HrSetWinsServiceRecoveryOption(PNETOCDATA pnocd) { CServiceManager sm; CService service; HRESULT hr = S_OK; SC_ACTION sra [4] = { { SC_ACTION_RESTART, 15*1000 }, // restart after 15 seconds { SC_ACTION_RESTART, 15*1000 }, // restart after 15 seconds { SC_ACTION_RESTART, 15*1000 }, // restart after 15 seconds { SC_ACTION_NONE, 30*1000 }, }; SERVICE_FAILURE_ACTIONS sfa = { 60 * 60, // dwResetPeriod is 1 hr L"", // no reboot message L"", // no command to execute 4, // 3 attempts to restart the server and stop after that sra }; hr = sm.HrOpenService(&service, L"WINS"); if (S_OK == hr) { hr = service.HrSetServiceRestartRecoveryOption(&sfa); } TraceError("HrSetWinsServiceRecoveryOption", hr); return hr; } //+--------------------------------------------------------------------------- // // Function: HrOcWinsOnInstall // // Purpose: Called by optional components installer code to handle // additional installation requirements for WINS Server. // // Arguments: // pnocd [in] Pointer to NETOC data. // // Returns: S_OK if successful, Win32 error otherwise. // // Author: danielwe 19 Jun 1997 // // Notes: // HRESULT HrOcWinsOnInstall(PNETOCDATA pnocd) { HRESULT hr = S_OK; if (pnocd->eit == IT_INSTALL) { hr = HrHandleStaticIpDependency(pnocd); if (SUCCEEDED(hr)) { hr = HrSetWinsServiceRecoveryOption(pnocd); } } else if (pnocd->eit == IT_UPGRADE) { HKEY hkey; // Upgrade the BackupDirPath value from whatever it was to // REG_EXPAND_SZ hr = HrRegOpenKeyEx(HKEY_LOCAL_MACHINE, c_szRegKeyWinsParams, KEY_ALL_ACCESS, &hkey); if (SUCCEEDED(hr)) { DWORD dwType; LPBYTE pbData = NULL; DWORD cbData; hr = HrRegQueryValueWithAlloc(hkey, c_szRegValWinsBackupDir, &dwType, &pbData, &cbData); if (SUCCEEDED(hr)) { switch (dwType) { case REG_MULTI_SZ: case REG_SZ: PWSTR pszNew; // This cast will give us the first string of the MULTI_SZ pszNew = reinterpret_cast(pbData); TraceTag(ttidNetOc, "Resetting %S to %S", c_szRegValWinsBackupDir, pszNew); hr = HrRegSetSz(hkey, c_szRegValWinsBackupDir, pszNew); break; } MemFree(pbData); } RegCloseKey(hkey); } // This process is non-fatal TraceError("HrOcWinsOnInstall - Failed to upgrade BackupDirPath - " "non-fatal", hr); // overwrite hr on purpose hr = HrSetWinsServiceRecoveryOption(pnocd); } else if (pnocd->eit == IT_REMOVE) { WCHAR szWinDir[MAX_PATH]; if (GetSystemDirectory(szWinDir, celems(szWinDir))) { lstrcatW(szWinDir, c_szWinsPath); // szWinDir should now be something like c:\winnt\system32\wins hr = HrDeleteFileSpecification(c_szFileSpec, szWinDir); } else { hr = HrFromLastWin32Error(); } if (FAILED(hr)) { TraceError("HrOcWinsOnInstall: failed to delete files, continuing...", hr); hr = S_OK; } } TraceError("HrOcWinsOnInstall", hr); return hr; } //+--------------------------------------------------------------------------- // // Function: HrOcDnsOnInstall // // Purpose: Called by optional components installer code to handle // additional installation requirements for DNS Server. // // Arguments: // pnocd [in] Pointer to NETOC data. // // Returns: S_OK if successful, Win32 error otherwise. // // Author: danielwe 19 Jun 1997 // // Notes: // HRESULT HrOcDnsOnInstall(PNETOCDATA pnocd) { HRESULT hr = S_OK; if (pnocd->eit == IT_INSTALL) { hr = HrHandleStaticIpDependency(pnocd); } TraceError("HrOcDnsOnInstall", hr); return hr; } //+--------------------------------------------------------------------------- // // Function: HrOcSnmpAgent // // Purpose: Installs the SNMP agent parameters // // Arguments: // pnocd [in] Pointer to NETOC data. // // Returns: S_OK if successful, Win32 error otherwise. // // Author: FlorinT 10/05/1998 // // Notes: // HRESULT HrOcSnmpAgent(PNETOCDATA pnocd) { tstring tstrVariable; PWSTR pTstrArray = NULL; HRESULT hr; // Read SNMP answer file params and save them to the registry //-------- read the 'Contact Name' parameter hr = HrSetupGetFirstString(g_ocmData.hinfAnswerFile, AF_SECTION, AF_SYSNAME, &tstrVariable); if (hr == S_OK) { hr = SnmpRegWriteTstring(REG_KEY_AGENT, SNMP_CONTACT, tstrVariable); } if (hr == S_OK || hr == HRESULT_FROM_SETUPAPI(ERROR_LINE_NOT_FOUND)) { //-------- read the 'Location' parameter hr = HrSetupGetFirstString(g_ocmData.hinfAnswerFile, AF_SECTION, AF_SYSLOCATION, &tstrVariable); } if (hr == S_OK) { hr = SnmpRegWriteTstring(REG_KEY_AGENT, SNMP_LOCATION, tstrVariable); } if (hr == S_OK || hr == HRESULT_FROM_SETUPAPI(ERROR_LINE_NOT_FOUND)) { //-------- read the 'Service' parameter hr = HrSetupGetFirstMultiSzFieldWithAlloc(g_ocmData.hinfAnswerFile, AF_SECTION, AF_SYSSERVICES, &pTstrArray); } if (hr == S_OK) { DWORD dwServices = SnmpStrArrayToServices(pTstrArray); delete pTstrArray; hr = SnmpRegWriteDword(REG_KEY_AGENT, SNMP_SERVICES, dwServices); } return (hr == HRESULT_FROM_SETUPAPI(ERROR_LINE_NOT_FOUND)) ? S_OK : hr; } //+--------------------------------------------------------------------------- // // Function: HrOcSnmpTraps // // Purpose: Installs the traps SNMP parameters defined in the answer file // // Arguments: // pnocd [in] Pointer to NETOC data. // // Returns: S_OK if successful, Win32 error otherwise. // // Author: FlorinT 10/05/1998 // // Notes: // HRESULT HrOcSnmpTraps(PNETOCDATA pnocd) { tstring tstrVariable; PWSTR pTstrArray = NULL; HRESULT hr; // Read SNMP answer file params and save them to the registry //-------- read the 'Trap community' parameter hr = HrSetupGetFirstString(g_ocmData.hinfAnswerFile, AF_SECTION, AF_TRAPCOMMUNITY, &tstrVariable); if (hr == S_OK) { //-------- read the 'Trap destinations' parameter HrSetupGetFirstMultiSzFieldWithAlloc(g_ocmData.hinfAnswerFile, AF_SECTION, AF_TRAPDEST, &pTstrArray); hr = SnmpRegWriteTraps(tstrVariable, pTstrArray); delete pTstrArray; } return (hr == HRESULT_FROM_SETUPAPI(ERROR_LINE_NOT_FOUND)) ? S_OK : hr; } // bitmask values for 'pFlag' parameter for HrOcSnmpSecurity() // they indicate which of the SNMP SECuritySETtings were defined through // the answerfile. #define SNMP_SECSET_COMMUNITIES 0x00000001 #define SNMP_SECSET_AUTHFLAG 0x00000002 #define SNMP_SECSET_PERMMGR 0x00000004 //+--------------------------------------------------------------------------- // // Function: HrOcSnmpSecurituy // // Purpose: Installs the security SNMP parameters defined in the answer file // // Arguments: // pnocd [in] Pointer to NETOC data. // // Returns: S_OK if successful, Win32 error otherwise. // // Author: FlorinT 10/05/1998 // // Notes: // HRESULT HrOcSnmpSecurity(PNETOCDATA pnocd, DWORD *pFlags) { BOOL bVariable = FALSE; PWSTR pTstrArray = NULL; HRESULT hr; // Read SNMP answer file params and save them to the registry //-------- read the 'Accepted communities' parameter hr = HrSetupGetFirstMultiSzFieldWithAlloc(g_ocmData.hinfAnswerFile, AF_SECTION, AF_ACCEPTCOMMNAME, &pTstrArray); if (hr == S_OK) { if (pFlags) (*pFlags) |= SNMP_SECSET_COMMUNITIES; hr = SnmpRegWriteCommunities(pTstrArray); delete pTstrArray; } if (hr == S_OK || hr == HRESULT_FROM_SETUPAPI(ERROR_LINE_NOT_FOUND)) { //-------- read the 'EnableAuthenticationTraps' parameter hr = HrSetupGetFirstStringAsBool(g_ocmData.hinfAnswerFile, AF_SECTION, AF_SENDAUTH, &bVariable); if (hr == S_OK) { if (pFlags) (*pFlags) |= SNMP_SECSET_AUTHFLAG; hr = SnmpRegWriteDword(REG_KEY_SNMP_PARAMETERS, REG_VALUE_AUTHENTICATION_TRAPS, bVariable); } } if (hr == S_OK || hr == HRESULT_FROM_SETUPAPI(ERROR_LINE_NOT_FOUND)) { //-------- read the 'Permitted Managers' parameter hr = HrSetupGetFirstStringAsBool(g_ocmData.hinfAnswerFile, AF_SECTION, AF_ANYHOST, &bVariable); } if (hr == S_OK) { pTstrArray = NULL; // if not 'any host', get the list of hosts from the inf file if (bVariable == FALSE) { hr = HrSetupGetFirstMultiSzFieldWithAlloc(g_ocmData.hinfAnswerFile, AF_SECTION, AF_LIMITHOST, &pTstrArray); } // at least clear up the 'permitted managers' list (bVariable = TRUE) // at most, write the allowed managers to the registry if (hr == S_OK) { if (pFlags) (*pFlags) |= SNMP_SECSET_PERMMGR; hr = SnmpRegWritePermittedMgrs(bVariable, pTstrArray); } if (pTstrArray != NULL) delete pTstrArray; } return (hr == HRESULT_FROM_SETUPAPI(ERROR_LINE_NOT_FOUND)) ? S_OK : hr; } //+--------------------------------------------------------------------------- // // Function: HrOcSnmpDefCommunity // // Purpose: Installs the default SNMP community. // // Arguments: // pnocd [in] Pointer to NETOC data. // // Returns: S_OK if successful, Win32 error otherwise. // // Author: FlorinT 10/05/1998 // // Notes: // HRESULT HrOcSnmpDefCommunity(PNETOCDATA pnocd) { HRESULT hr = S_OK; hr = SnmpRegWriteDefCommunity(); return hr; } //+--------------------------------------------------------------------------- // // Function: HrOcSnmpUpgParams // // Purpose: makes all the registry changes needed when upgrading to Win2K // // Arguments: // pnocd [in] Pointer to NETOC data. // // Returns: S_OK if successful, Win32 error otherwise. // // Author: FlorinT 10/05/1998 // // Notes: // HRESULT HrOcSnmpUpgParams(PNETOCDATA pnocd) { HRESULT hr = S_OK; hr = SnmpRegUpgEnableAuthTraps(); return hr; } //+--------------------------------------------------------------------------- // // Function: HrOcSnmpOnInstall // // Purpose: Called by optional components installer code to handle // additional installation requirements for SNMP. // // Arguments: // pnocd [in] Pointer to NETOC data. // // Returns: S_OK if successful, Win32 error otherwise. // // Author: danielwe 15 Sep 1998 // // Notes: // HRESULT HrOcSnmpOnInstall(PNETOCDATA pnocd) { HRESULT hr = S_OK; DWORD secFlags = 0; if ((pnocd->eit == IT_INSTALL) | (pnocd->eit == IT_UPGRADE)) { // --ft:10/14/98-- bug #237203 - success if there is no answer file! if (g_ocmData.hinfAnswerFile != NULL) { hr = HrOcSnmpSecurity(pnocd, &secFlags); if (hr == S_OK) hr = HrOcSnmpTraps(pnocd); if (hr == S_OK) hr = HrOcSnmpAgent(pnocd); } } // configure the 'public' community as a read-only community only if: // fresh installing and (there is no answer_file or there is an answer_file but it doesn't // configure any community) if (hr == S_OK && pnocd->eit == IT_INSTALL && !(secFlags & SNMP_SECSET_COMMUNITIES)) { hr = HrOcSnmpDefCommunity(pnocd); } // on upgrade only look at the old EnableAuthTraps value and copy it to the new location if (hr == S_OK && pnocd->eit == IT_UPGRADE) { // don't care here about the return code. The upgrade from W2K to W2K fail here and we // don't need to fail in this case. Any failure in upgrading the setting from NT4 to W2K // will result in having the default parameter. HrOcSnmpUpgParams(pnocd); } if (hr == S_OK && (pnocd->eit == IT_INSTALL || pnocd->eit == IT_UPGRADE) ) { // set admin dacl to ValidCommunities subkey hr = SnmpAddAdminAclToKey(REG_KEY_VALID_COMMUNITIES); if (hr == S_OK) { // set admin dacl to PermittedManagers subkey hr = SnmpAddAdminAclToKey(REG_KEY_PERMITTED_MANAGERS); } } TraceError("HrOcSnmpOnInstall", hr); return (hr == HRESULT_FROM_SETUPAPI(ERROR_SECTION_NOT_FOUND)) ? S_OK : hr; }