2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-08-31 06:25:31 +00:00

Added support for installer to change the account being used rather than uninstalling and reinstalling

This commit is contained in:
Danny Mayer
2001-09-26 02:22:27 +00:00
parent a4701d3b7e
commit 7e22eec300
5 changed files with 136 additions and 30 deletions

View File

@@ -43,7 +43,7 @@ RSC=rc.exe
# PROP Ignore_Export_Lib 0 # PROP Ignore_Export_Lib 0
# PROP Target_Dir "" # PROP Target_Dir ""
# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /Yu"stdafx.h" /FD /c # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /Yu"stdafx.h" /FD /c
# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\include" /I "..\..\..\include" /I "..\..\named\win32\include" /I "..\..\..\lib\isc\win32\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_AFXDLL" /Yu"stdafx.h" /FD /TP /c # ADD CPP /nologo /MD /W3 /GX /O2 /I "..\include" /I "..\..\..\include" /I "..\..\named\win32\include" /I "..\..\..\lib\isc\win32\include" /I "..\..\..\lib\isc\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_AFXDLL" /Yu"stdafx.h" /FD /TP /c
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
# ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD BASE RSC /l 0x409 /d "NDEBUG"
@@ -69,7 +69,7 @@ LINK32=link.exe
# PROP Ignore_Export_Lib 0 # PROP Ignore_Export_Lib 0
# PROP Target_Dir "" # PROP Target_Dir ""
# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /Yu"stdafx.h" /FD /GZ /c # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /Yu"stdafx.h" /FD /GZ /c
# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "..\include" /I "..\..\..\include" /I "..\..\named\win32\include" /I "..\..\..\lib\isc\win32\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_AFXDLL" /FR /Yu"stdafx.h" /FD /TP /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "..\include" /I "..\..\..\include" /I "..\..\named\win32\include" /I "..\..\..\lib\isc\win32\include" /I "..\..\..\lib\isc\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_AFXDLL" /FR /Yu"stdafx.h" /FD /TP /GZ /c
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
# ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD BASE RSC /l 0x409 /d "_DEBUG"

View File

@@ -131,6 +131,15 @@ BEGIN
WS_VSCROLL | WS_TABSTOP WS_VSCROLL | WS_TABSTOP
END END
IDD_DIALOG1 DIALOG DISCARDABLE 0, 0, 186, 95
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Dialog"
FONT 8, "MS Sans Serif"
BEGIN
DEFPUSHBUTTON "OK",IDOK,129,7,50,14
PUSHBUTTON "Cancel",IDCANCEL,129,24,50,14
END
#ifndef _MAC #ifndef _MAC
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
@@ -212,6 +221,14 @@ BEGIN
TOPMARGIN, 7 TOPMARGIN, 7
BOTTOMMARGIN, 110 BOTTOMMARGIN, 110
END END
IDD_DIALOG1, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 179
TOPMARGIN, 7
BOTTOMMARGIN, 88
END
END END
#endif // APSTUDIO_INVOKED #endif // APSTUDIO_INVOKED
@@ -291,9 +308,10 @@ BEGIN
IDS_FILE_BAD "Could not retrieve version info for file %s. Do you wish to continue?\n(Continuing may overwrite a newer version of the file) " IDS_FILE_BAD "Could not retrieve version info for file %s. Do you wish to continue?\n(Continuing may overwrite a newer version of the file) "
IDS_ERR_TOOPRIVED "Chosen account has too many privileges. Do you wish to choose a different account name?" IDS_ERR_TOOPRIVED "Chosen account has too many privileges. Do you wish to choose a different account name?"
IDS_ERR_BADACCOUNT "Error Validating Account. Unable to install service using this account." IDS_ERR_BADACCOUNT "Error Validating Account. Unable to install service using this account."
IDS_ERR_WRONGPRIV "The wrong privilege: %s was detected. The Service Logon Right privilege is required." IDS_ERR_WRONGPRIV "The wrong privilege: %s was detected. Only the Service Logon Right privilege should be enabled for this account."
IDS_CREATEACCOUNT_FAILED "Unable to Create Account for the Service." IDS_CREATEACCOUNT_FAILED "Unable to Create Account for the Service."
IDS_ERR_PASSWORD "Passwords entered did not match. Please reenter password." IDS_ERR_PASSWORD "Passwords entered did not match. Please reenter password."
IDS_ERR_UPDATE_SERVICE "Error updating service\n(%s)"
END END
#endif // English (U.S.) resources #endif // English (U.S.) resources

View File

@@ -15,7 +15,7 @@
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/ */
/* $Id: BINDInstallDlg.cpp,v 1.8 2001/09/25 01:48:47 mayer Exp $ */ /* $Id: BINDInstallDlg.cpp,v 1.9 2001/09/26 02:22:25 mayer Exp $ */
/* /*
* Copyright (c) 1999-2000 by Nortel Networks Corporation * Copyright (c) 1999-2000 by Nortel Networks Corporation
@@ -167,7 +167,9 @@ CBINDInstallDlg::CBINDInstallDlg(CWnd* pParent /*=NULL*/)
m_installed = FALSE; m_installed = FALSE;
m_accountExists = FALSE; m_accountExists = FALSE;
m_accountUsed = FALSE; m_accountUsed = FALSE;
m_serviceExists = TRUE;
GetCurrentServiceAccountName(); GetCurrentServiceAccountName();
m_currentAccount = m_accountName;
if (m_accountName == "") { if (m_accountName == "") {
m_accountName = "named"; m_accountName = "named";
} }
@@ -318,7 +320,8 @@ void CBINDInstallDlg::OnUninstall() {
if (CheckBINDService()) if (CheckBINDService())
StopBINDService(); StopBINDService();
HANDLE hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); HANDLE hSCManager = OpenSCManager(NULL, NULL,
SC_MANAGER_ALL_ACCESS);
if (!hSCManager) { if (!hSCManager) {
MsgBox(IDS_ERR_OPEN_SCM, GetErrMessage()); MsgBox(IDS_ERR_OPEN_SCM, GetErrMessage());
return; return;
@@ -326,7 +329,7 @@ void CBINDInstallDlg::OnUninstall() {
HANDLE hService = OpenService(hSCManager, BIND_SERVICE_NAME, HANDLE hService = OpenService(hSCManager, BIND_SERVICE_NAME,
SERVICE_ALL_ACCESS); SERVICE_ALL_ACCESS);
if (!hService && GetLastError() != ERROR_SERVICE_DOES_NOT_EXIST) { if (!hService && GetLastError() != ERROR_SERVICE_DOES_NOT_EXIST){
MsgBox(IDS_ERR_OPEN_SERVICE, GetErrMessage()); MsgBox(IDS_ERR_OPEN_SERVICE, GetErrMessage());
return; return;
} }
@@ -394,21 +397,26 @@ void CBINDInstallDlg::OnInstall() {
if (ValidateServiceAccount() == FALSE) if (ValidateServiceAccount() == FALSE)
return; return;
// Directories
/* For Registration we need to know if account was changed */
if(m_accountName != m_currentAccount)
m_accountUsed = FALSE;
/* Directories */
m_etcDir = m_targetDir + "\\etc"; m_etcDir = m_targetDir + "\\etc";
m_binDir = m_targetDir + "\\bin"; m_binDir = m_targetDir + "\\bin";
if (m_defaultDir != m_targetDir) { if (m_defaultDir != m_targetDir) {
if (GetFileAttributes(m_targetDir) != 0xFFFFFFFF) if (GetFileAttributes(m_targetDir) != 0xFFFFFFFF)
{ {
int install = MsgBox(IDS_DIREXIST, MB_YESNO | MB_ICONQUESTION, int install = MsgBox(IDS_DIREXIST,
m_targetDir); MB_YESNO | MB_ICONQUESTION, m_targetDir);
if (install == IDNO) if (install == IDNO)
return; return;
} }
else { else {
int createDir = MsgBox(IDS_CREATEDIR, MB_YESNO | MB_ICONQUESTION, int createDir = MsgBox(IDS_CREATEDIR,
m_targetDir); MB_YESNO | MB_ICONQUESTION, m_targetDir);
if (createDir == IDNO) if (createDir == IDNO)
return; return;
} }
@@ -421,7 +429,7 @@ void CBINDInstallDlg::OnInstall() {
MsgBox(IDS_CREATEACCOUNT_FAILED); MsgBox(IDS_CREATEACCOUNT_FAILED);
return; return;
} }
m_accountExists; m_accountExists = TRUE;
} }
ProgramGroup(); ProgramGroup();
@@ -453,10 +461,12 @@ void CBINDInstallDlg::OnInstall() {
CString buf(BIND_DISPLAY_NAME); CString buf(BIND_DISPLAY_NAME);
GetWindowsDirectory(winDir, MAX_PATH); GetWindowsDirectory(winDir, MAX_PATH);
RegSetValueEx(hKey, "DisplayName", 0, REG_SZ, (LPBYTE)(LPCTSTR)buf, buf.GetLength()); RegSetValueEx(hKey, "DisplayName", 0, REG_SZ,
(LPBYTE)(LPCTSTR)buf, buf.GetLength());
buf.Format("%s\\BINDInstall.exe", winDir); buf.Format("%s\\BINDInstall.exe", winDir);
RegSetValueEx(hKey, "UninstallString", 0, REG_SZ, (LPBYTE)(LPCTSTR)buf, buf.GetLength()); RegSetValueEx(hKey, "UninstallString", 0, REG_SZ,
(LPBYTE)(LPCTSTR)buf, buf.GetLength());
RegCloseKey(hKey); RegCloseKey(hKey);
} }
@@ -622,15 +632,19 @@ void
CBINDInstallDlg::GetCurrentServiceAccountName() { CBINDInstallDlg::GetCurrentServiceAccountName() {
HKEY hKey; HKEY hKey;
BOOL keyFound = FALSE; BOOL keyFound = FALSE;
char accountName[50]; char accountName[MAX_PATH];
DWORD nameLen = strlen(accountName); DWORD nameLen = MAX_PATH;
CString Tmp; CString Tmp;
m_accountUsed = FALSE; m_accountUsed = FALSE;
memset(accountName, 0, nameLen); memset(accountName, 0, nameLen);
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, BIND_SERVICE_SUBKEY, 0, KEY_READ, if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, BIND_SERVICE_SUBKEY, 0, KEY_READ,
&hKey) == ERROR_SUCCESS) &hKey) == ERROR_SUCCESS) {
keyFound = TRUE; keyFound = TRUE;
}
else {
m_serviceExists = FALSE;
}
if (keyFound == TRUE) { if (keyFound == TRUE) {
/* Get the named service account, if one was specified */ /* Get the named service account, if one was specified */
@@ -638,7 +652,7 @@ CBINDInstallDlg::GetCurrentServiceAccountName() {
(LPBYTE)accountName, &nameLen) != ERROR_SUCCESS) (LPBYTE)accountName, &nameLen) != ERROR_SUCCESS)
keyFound = FALSE; keyFound = FALSE;
} }
RegCloseKey(hKey); RegCloseKey(hKey);
if(keyFound == FALSE) if(keyFound == FALSE)
m_accountName = ""; m_accountName = "";
@@ -689,18 +703,35 @@ CBINDInstallDlg::ValidateServiceAccount() {
else else
return (TRUE); return (TRUE);
} }
/* See if we have the correct privilege */
if (wcscmp(PrivList[0], SE_SERVICE_LOGON_PRIV) == 0)
return (TRUE);
MsgBox(IDS_ERR_WRONGPRIV, PrivList[0]); /* See if we have the correct privilege */
return (FALSE); if (wcscmp(PrivList[0], SE_SERVICE_LOGON_PRIV) != 0) {
MsgBox(IDS_ERR_WRONGPRIV, PrivList[0]);
return (FALSE);
}
return (TRUE);
} }
void void
CBINDInstallDlg::RegisterService() { CBINDInstallDlg::RegisterService() {
HANDLE hSCManager; HANDLE hSCManager;
HANDLE hService; HANDLE hService;
CString StartName = ".\\" + m_accountName;
/*
* We need to change the service rather than create it
* if the service already exists. Do nothing if we are already
* using that account
*/
if(m_serviceExists == TRUE) {
if(m_accountUsed == FALSE) {
UpdateService();
return;
}
else {
return;
}
}
SetCurrent(IDS_OPEN_SCM); SetCurrent(IDS_OPEN_SCM);
hSCManager= OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); hSCManager= OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
@@ -719,17 +750,69 @@ CBINDInstallDlg::RegisterService() {
SetCurrent(IDS_CREATE_SERVICE); SetCurrent(IDS_CREATE_SERVICE);
hService = CreateService(hSCManager, BIND_SERVICE_NAME, hService = CreateService(hSCManager, BIND_SERVICE_NAME,
BIND_DISPLAY_NAME, SERVICE_ALL_ACCESS, dwServiceType, dwStart, BIND_DISPLAY_NAME, SERVICE_ALL_ACCESS, dwServiceType, dwStart,
SERVICE_ERROR_NORMAL, namedLoc, NULL, NULL, NULL, NULL, NULL); SERVICE_ERROR_NORMAL, namedLoc, NULL, NULL, NULL, StartName,
m_accountPassword);
if (!hService && GetLastError() != ERROR_SERVICE_EXISTS) if (!hService && GetLastError() != ERROR_SERVICE_EXISTS)
throw(Exception(IDS_ERR_CREATE_SERVICE, GetErrMessage())); throw(Exception(IDS_ERR_CREATE_SERVICE, GetErrMessage()));
if (hService)
CloseServiceHandle(hService);
if (hSCManager) if (hSCManager)
CloseServiceHandle(hSCManager); CloseServiceHandle(hSCManager);
SetItemStatus(IDC_REG_SERVICE);
}
void
CBINDInstallDlg::UpdateService() {
HANDLE hSCManager;
HANDLE hService;
CString StartName = ".\\" + m_accountName;
SetCurrent(IDS_OPEN_SCM);
hSCManager= OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (!hSCManager) {
MsgBox(IDS_ERR_OPEN_SCM, GetErrMessage());
return;
}
DWORD dwStart = SERVICE_DEMAND_START;
if (m_autoStart)
dwStart = SERVICE_AUTO_START;
DWORD dwServiceType = SERVICE_WIN32_OWN_PROCESS;
CString namedLoc;
namedLoc.Format("%s\\bin\\named.exe", m_targetDir);
SetCurrent(IDS_OPEN_SERVICE);
hService = OpenService(hSCManager, BIND_SERVICE_NAME,
SERVICE_CHANGE_CONFIG);
if (!hService)
{
MsgBox(IDS_ERR_OPEN_SERVICE, GetErrMessage());
if (hSCManager)
CloseServiceHandle(hSCManager);
return;
}
else {
if (ChangeServiceConfig(hService, dwServiceType, dwStart,
SERVICE_ERROR_NORMAL, namedLoc, NULL, NULL, NULL,
StartName, m_accountPassword,BIND_DISPLAY_NAME)
!= TRUE) {
DWORD err = GetLastError();
MsgBox(IDS_ERR_UPDATE_SERVICE, GetErrMessage());
}
}
if (hService) if (hService)
CloseServiceHandle(hService); CloseServiceHandle(hService);
if (hSCManager)
CloseServiceHandle(hSCManager);
SetItemStatus(IDC_REG_SERVICE); SetItemStatus(IDC_REG_SERVICE);
} }
@@ -772,12 +855,12 @@ void CBINDInstallDlg::UnregisterService(BOOL uninstall) {
break; break;
} }
if (hSCManager)
CloseServiceHandle(hSCManager);
if (hService) if (hService)
CloseServiceHandle(hService); CloseServiceHandle(hService);
if (hSCManager)
CloseServiceHandle(hSCManager);
if (uninstall) if (uninstall)
SetItemStatus(IDC_REG_SERVICE, rc); SetItemStatus(IDC_REG_SERVICE, rc);
} }

View File

@@ -15,7 +15,7 @@
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/ */
/* $Id: BINDInstallDlg.h,v 1.4 2001/09/25 01:48:48 mayer Exp $ */ /* $Id: BINDInstallDlg.h,v 1.5 2001/09/26 02:22:26 mayer Exp $ */
/* /*
* Copyright (c) 1999-2000 by Nortel Networks Corporation * Copyright (c) 1999-2000 by Nortel Networks Corporation
@@ -72,6 +72,7 @@ protected:
void DeleteFiles(BOOL uninstall); void DeleteFiles(BOOL uninstall);
void RegisterService(); void RegisterService();
void UpdateService();
void UnregisterService(BOOL uninstall); void UnregisterService(BOOL uninstall);
void RegisterMessages(); void RegisterMessages();
@@ -100,10 +101,12 @@ protected:
CString m_currentDir; CString m_currentDir;
BOOL m_accountExists; BOOL m_accountExists;
BOOL m_accountUsed; BOOL m_accountUsed;
CString m_currentAccount;
CString m_accountName; CString m_accountName;
CString m_accountPasswordConfirm; CString m_accountPasswordConfirm;
CString m_accountPassword; CString m_accountPassword;
BOOL m_serviceExists;
// Generated message map functions // Generated message map functions
//{{AFX_MSG(CBINDInstallDlg) //{{AFX_MSG(CBINDInstallDlg)
virtual BOOL OnInitDialog(); virtual BOOL OnInitDialog();

View File

@@ -55,12 +55,14 @@
#define IDS_ERR_WRONGPRIV 54 #define IDS_ERR_WRONGPRIV 54
#define IDS_CREATEACCOUNT_FAILED 55 #define IDS_CREATEACCOUNT_FAILED 55
#define IDS_ERR_PASSWORD 56 #define IDS_ERR_PASSWORD 56
#define IDS_ERR_UPDATE_SERVICE 57
#define IDD_BINDINSTALL_DIALOG 102 #define IDD_BINDINSTALL_DIALOG 102
#define IDR_MAINFRAME 128 #define IDR_MAINFRAME 128
#define IDD_BROWSE 129 #define IDD_BROWSE 129
#define IDI_CHECK 130 #define IDI_CHECK 130
#define IDI_X 132 #define IDI_X 132
#define IDC_CURSOR1 142 #define IDC_CURSOR1 142
#define IDD_DIALOG1 143
#define IDC_TARGETDIR 1001 #define IDC_TARGETDIR 1001
#define IDC_BROWSE 1002 #define IDC_BROWSE 1002
#define IDC_DIRLIST 1004 #define IDC_DIRLIST 1004
@@ -91,7 +93,7 @@
// //
#ifdef APSTUDIO_INVOKED #ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS #ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 143 #define _APS_NEXT_RESOURCE_VALUE 144
#define _APS_NEXT_COMMAND_VALUE 32771 #define _APS_NEXT_COMMAND_VALUE 32771
#define _APS_NEXT_CONTROL_VALUE 1027 #define _APS_NEXT_CONTROL_VALUE 1027
#define _APS_NEXT_SYMED_VALUE 104 #define _APS_NEXT_SYMED_VALUE 104