From: Olivier M. <ep...@us...> - 2003-08-31 09:08:19
|
Build Version : T2.0.0.4495 Firebird 2.0 Alpha 1 (writeBuildNum.sh,v 1.4494 2003/08/31 09:08:10 epocman Exp ) Update of /cvsroot/firebird/firebird2/src/utilities In directory sc8-pr-cvs1:/tmp/cvs-serv2033/src/utilities Modified Files: Tag: B1_5_Release install_nt.h install_reg.cpp install_svc.cpp regis_proto.h registry.cpp servi_proto.h services.cpp Log Message: OEM/Ansi conversions, command-line password, other minor updates. Index: install_nt.h =================================================================== RCS file: /cvsroot/firebird/firebird2/src/utilities/Attic/install_nt.h,v retrieving revision 1.7.2.1 retrieving revision 1.7.2.2 diff -b -U3 -r1.7.2.1 -r1.7.2.2 --- install_nt.h 29 Aug 2003 13:45:42 -0000 1.7.2.1 +++ install_nt.h 31 Aug 2003 09:08:07 -0000 1.7.2.2 @@ -63,4 +63,6 @@ #define IB_GUARDIAN_ALREADY_DEFINED 102 #define IB_GUARDIAN_RUNNING 103 +#define FB_LOGON_SRVC_RIGHT_ALREADY_DEFINED 104 + #endif /* _UTILITIES_INSTALL_NT_H_ */ Index: install_reg.cpp =================================================================== RCS file: /cvsroot/firebird/firebird2/src/utilities/Attic/install_reg.cpp,v retrieving revision 1.9.2.1 retrieving revision 1.9.2.2 diff -b -U3 -r1.9.2.1 -r1.9.2.2 --- install_reg.cpp 29 Aug 2003 13:45:42 -0000 1.9.2.1 +++ install_reg.cpp 31 Aug 2003 09:08:08 -0000 1.9.2.2 @@ -60,12 +60,13 @@ **************************************/ TEXT **end, *p, *q, *cmd; TEXT directory[MAXPATHLEN]; - USHORT sw_command, sw_version; + USHORT sw_command; + bool sw_version; USHORT i, ret, len; HKEY hkey_node; sw_command = COMMAND_NONE; - sw_version = FALSE; + sw_version = false; // Let's get the root directory from the instance path of this program. // argv[0] is only _mostly_ guaranteed to give this info, @@ -111,7 +112,7 @@ switch (UPPER(*p)) { case 'Z': - sw_version = TRUE; + sw_version = true; break; default: @@ -142,7 +143,7 @@ break; case COMMAND_REMOVE: - ret = REGISTRY_remove(hkey_node, FALSE, reg_error); + ret = REGISTRY_remove(hkey_node, false, reg_error); if (ret != FB_SUCCESS) ib_printf("Firebird has not been deleted from the registry.\n"); else @@ -194,8 +195,11 @@ ib_printf("Windows NT error %"SLONGFORMAT"\n", status); } else + { + CharToOem(buffer, buffer); ib_printf("%s\n", buffer); } + } return FB_FAILURE; } @@ -213,11 +217,10 @@ **************************************/ ib_printf("\nUsage:\n"); - ib_printf(" instreg install\n"); - ib_printf(" remove\n\n"); + ib_printf(" instreg i[nstall]\n"); + ib_printf(" r[emove]\n\n"); ib_printf(" This utility should be located and run from the 'bin' directory\n"); ib_printf(" of your Firebird installation.\n\n"); - ib_printf(" '*' denotes the default values\n"); ib_printf(" '-z' can be used with any other option, prints version\n"); exit(FINI_OK); Index: install_svc.cpp =================================================================== RCS file: /cvsroot/firebird/firebird2/src/utilities/Attic/install_svc.cpp,v retrieving revision 1.18.2.1 retrieving revision 1.18.2.2 diff -b -U3 -r1.18.2.1 -r1.18.2.2 --- install_svc.cpp 29 Aug 2003 13:45:42 -0000 1.18.2.1 +++ install_svc.cpp 31 Aug 2003 09:08:08 -0000 1.18.2.2 @@ -25,6 +25,7 @@ #include "../jrd/ib_stdio.h" #include <stdlib.h> #include <windows.h> +#include <conio.h> #include "../jrd/common.h" #include "../jrd/license.h" #include "../utilities/install_nt.h" @@ -68,12 +69,16 @@ **************************************/ TEXT **end, *p, *q, *cmd; TEXT directory[MAXPATHLEN]; - USHORT sw_command, sw_version, sw_startup, sw_mode, sw_guardian, sw_arch; + TEXT full_username[128]; + TEXT oem_username[128]; + TEXT keyb_password[64]; + USHORT sw_command, sw_startup, sw_mode, sw_guardian, sw_arch; + bool sw_version; USHORT i, status, len; SC_HANDLE manager, service; sw_command = COMMAND_NONE; - sw_version = FALSE; + sw_version = false; sw_startup = STARTUP_AUTO; sw_mode = DEFAULT_PRIORITY; sw_guardian = NO_GUARDIAN; @@ -154,7 +159,7 @@ break; case 'Z': - sw_version = TRUE; + sw_version = true; break; case 'G': @@ -196,11 +201,63 @@ (!directory && sw_command == COMMAND_INSTALL) || (directory && sw_command != COMMAND_INSTALL) || */ - (username && sw_command != COMMAND_INSTALL)) + (username != 0 && sw_command != COMMAND_INSTALL)) { usage(); } + if (sw_command == COMMAND_INSTALL && username != 0) + { + p = username; + while (*p != '\0' && *p != '\\') ++p; + if (*p == '\0') + { + DWORD cnlen = sizeof(full_username); + GetComputerName(full_username, &cnlen); + strcat(full_username, "\\"); + strncat(full_username, username, sizeof(full_username) - (cnlen + 1)); + } + else + strncpy(full_username, username, sizeof(full_username)); + full_username[sizeof(full_username) -1] = '\0'; + CharToOem(full_username, oem_username); + username = full_username; + + if (password == 0) + { + ib_printf("Enter %s user password : ", oem_username); + p = keyb_password; + q = p + sizeof(keyb_password) - 1; // keep room for '\0' + while (p < q && (*p++ = getch()) != '\r') putch('*'); // Win32 only + *(p - 1) = '\0'; // Cuts at '\r' + ib_printf("\n"); + OemToChar(keyb_password, keyb_password); + password = keyb_password; + } + + // Let's grant "Logon as a Service" right to the -login user + switch (SERVICES_grant_logon_right(full_username, svc_error)) + { + case FB_LOGON_SRVC_RIGHT_ALREADY_DEFINED : + /* + // OM - I think it is better not to bother the admin with this message. + ib_printf("The 'Logon as a Service' right was already " + "granted to %s\n", oem_username); + */ + break; + case FB_SUCCESS : + ib_printf("The 'Logon as a Service' right has been " + "granted to %s\n", oem_username); + break; + case FB_FAILURE : + default : + ib_printf("Failed granting the 'Logon as a Service' right " + "to %s\n", oem_username); + exit(FINI_ERROR); + break; + } + } + manager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); if (manager == NULL) { @@ -276,28 +333,22 @@ */ } + service = OpenService(manager, REMOTE_SERVICE, SERVICE_ALL_ACCESS); + if (service) + { + CloseServiceHandle(service); status = SERVICES_remove(manager, REMOTE_SERVICE, REMOTE_DISPLAY_NAME, svc_error); if (status == FB_SUCCESS) { ib_printf("Service \"%s\" successfully deleted.\n", REMOTE_DISPLAY_NAME); - /* - status = SERVICES_delete(manager, REMOTE_SERVICE, REMOTE_DISPLAY_NAME, - svc_error); - - if (status == FB_SUCCESS) - ib_printf("Service configuration for \"%s\" successfully re-initialized.\n", - REMOTE_DISPLAY_NAME); - else - ib_printf("Service configuration for \"%s\" not re-initialized.\n", - REMOTE_DISPLAY_NAME); - */ } else if (status == IB_SERVICE_RUNNING) { ib_printf("Service \"%s\" not deleted.\n", REMOTE_DISPLAY_NAME); ib_printf("You must stop it before attempting to delete it.\n\n"); } + } /* else ib_printf("Service \"%s\" not deleted.\n", REMOTE_DISPLAY_NAME); @@ -321,6 +372,7 @@ } else { + CloseServiceHandle(service); status = SERVICES_start(manager, REMOTE_SERVICE, REMOTE_DISPLAY_NAME, sw_mode, svc_error); if (status == FB_SUCCESS) @@ -342,12 +394,10 @@ ISCGUARD_DISPLAY_NAME, svc_error); if (status == FB_SUCCESS) ib_printf("Service \"%s\" successfully stopped.\n", ISCGUARD_DISPLAY_NAME); - /* - else - ib_printf("Service \"%s\" not stopped.\n", ISCGUARD_DISPLAY_NAME); - */ } - else { + else + { + CloseServiceHandle(service); status = SERVICES_stop(manager, REMOTE_SERVICE, REMOTE_DISPLAY_NAME, svc_error); if (status == FB_SUCCESS) @@ -412,6 +462,8 @@ qsc = (QUERY_SERVICE_CONFIG*) new UCHAR[uSize]; if (qsc && QueryServiceConfig(service, qsc, uSize, &uSize)) { + CharToOem(qsc->lpBinaryPathName, qsc->lpBinaryPathName); + CharToOem(qsc->lpServiceStartName, qsc->lpServiceStartName); ib_printf(" Path : %s\n", qsc->lpBinaryPathName); ib_printf(" Startup : "); switch (qsc->dwStartType) @@ -482,8 +534,11 @@ ib_printf("Windows NT error %"SLONGFORMAT"\n", status); } else + { + CharToOem(buffer, buffer); ib_printf("%s", buffer); // '\n' is included in system messages } + } return FB_FAILURE; } @@ -499,18 +554,20 @@ * **************************************/ ib_printf("\nUsage:\n"); - ib_printf(" instsvc install [ -superserver* | -classic ]\n"); - ib_printf(" [ -auto* | -demand ]\n"); - ib_printf(" [ -guardian ]\n"); - ib_printf(" [ -login username password ]\n\n"); - ib_printf(" start [ -boostpriority ]\n"); - ib_printf(" stop\n"); - ib_printf(" query\n"); - ib_printf(" remove\n\n"); + ib_printf(" instsvc i[nstall] [ -s[uperserver]* | -c[lassic] ]\n"); + ib_printf(" [ -a[uto]* | -d[emand] ]\n"); + ib_printf(" [ -g[uardian] ]\n"); + ib_printf(" [ -l[ogin] username [password] ]\n\n"); + ib_printf(" sta[rt] [ -b[oostpriority] ]\n"); + ib_printf(" sto[p]\n"); + ib_printf(" q[uery]\n"); + ib_printf(" r[emove]\n\n"); ib_printf(" This utility should be located and run from the 'bin' directory\n"); ib_printf(" of your Firebird installation.\n\n"); ib_printf(" '*' denotes the default values\n"); ib_printf(" '-z' can be used with any other option, prints version\n"); + ib_printf(" 'username' refers by default to a local account on this machine.\n"); + ib_printf(" Use the format 'domain\\username' or 'server\\username' if appropriate.\n"); exit(FINI_OK); } Index: regis_proto.h =================================================================== RCS file: /cvsroot/firebird/firebird2/src/utilities/Attic/regis_proto.h,v retrieving revision 1.2 retrieving revision 1.2.4.1 diff -b -U3 -r1.2 -r1.2.4.1 --- regis_proto.h 28 Aug 2002 15:48:49 -0000 1.2 +++ regis_proto.h 31 Aug 2003 09:08:08 -0000 1.2.4.1 @@ -25,6 +25,6 @@ #define _UTILITIES_REGIS_PROTO_H_ extern USHORT REGISTRY_install (HKEY, TEXT *, USHORT (*)(SLONG, TEXT *, HKEY)); -extern USHORT REGISTRY_remove (HKEY, USHORT, USHORT (*)(SLONG, TEXT *, HKEY)); +extern USHORT REGISTRY_remove (HKEY, bool, USHORT (*)(SLONG, TEXT *, HKEY)); #endif /* _UTILITIES_REGIS_PROTO_H_ */ Index: registry.cpp =================================================================== RCS file: /cvsroot/firebird/firebird2/src/utilities/Attic/registry.cpp,v retrieving revision 1.10.2.1 retrieving revision 1.10.2.2 diff -b -U3 -r1.10.2.1 -r1.10.2.2 --- registry.cpp 29 Aug 2003 13:45:42 -0000 1.10.2.1 +++ registry.cpp 31 Aug 2003 09:08:08 -0000 1.10.2.2 @@ -35,7 +35,7 @@ #include "../utilities/regis_proto.h" #include "../utilities/registry.h" -static USHORT remove_subkeys(HKEY, USHORT, USHORT(*)(SLONG, TEXT *, HKEY)); +static USHORT remove_subkeys(HKEY, bool, USHORT(*)(SLONG, TEXT *, HKEY)); USHORT REGISTRY_install(HKEY hkey_node, TEXT * directory, USHORT(*err_handler)(SLONG, TEXT *, HKEY)) @@ -81,7 +81,7 @@ (DWORD) sizeof(GDS_VERSION))) != ERROR_SUCCESS) { (*err_handler) (status, "RegSetValueEx", hkey_kit); if (disp == REG_CREATED_NEW_KEY) - REGISTRY_remove(hkey_node, TRUE, err_handler); + REGISTRY_remove(hkey_node, true, err_handler); return FB_FAILURE; } @@ -99,7 +99,7 @@ (DWORD)(len + 1))) != ERROR_SUCCESS) { (*err_handler) (status, "RegSetValueEx", hkey_kit); if (disp == REG_CREATED_NEW_KEY) - REGISTRY_remove(hkey_node, TRUE, err_handler); + REGISTRY_remove(hkey_node, true, err_handler); return FB_FAILURE; } @@ -108,7 +108,7 @@ 1)) != ERROR_SUCCESS) { (*err_handler) (status, "RegSetValueEx", hkey_kit); if (disp == REG_CREATED_NEW_KEY) - REGISTRY_remove(hkey_node, TRUE, err_handler); + REGISTRY_remove(hkey_node, true, err_handler); return FB_FAILURE; } */ @@ -119,7 +119,7 @@ USHORT REGISTRY_remove(HKEY hkey_node, - USHORT silent_flag, USHORT(*err_handler)(SLONG, TEXT *, HKEY)) + bool silent_flag, USHORT(*err_handler)(SLONG, TEXT *, HKEY)) { /************************************** * @@ -164,7 +164,7 @@ static USHORT remove_subkeys( HKEY hkey, - USHORT silent_flag, USHORT(*err_handler)(SLONG, TEXT *, HKEY)) + bool silent_flag, USHORT(*err_handler)(SLONG, TEXT *, HKEY)) { /************************************** * Index: servi_proto.h =================================================================== RCS file: /cvsroot/firebird/firebird2/src/utilities/Attic/servi_proto.h,v retrieving revision 1.3.2.1 retrieving revision 1.3.2.2 diff -b -U3 -r1.3.2.1 -r1.3.2.2 --- servi_proto.h 29 Aug 2003 13:45:42 -0000 1.3.2.1 +++ servi_proto.h 31 Aug 2003 09:08:08 -0000 1.3.2.2 @@ -58,5 +58,7 @@ TEXT *service_name, TEXT *display_name, USHORT (*)(SLONG, TEXT *, SC_HANDLE)); +extern USHORT SERVICES_grant_logon_right (TEXT*, + USHORT (*)(SLONG, TEXT *, SC_HANDLE)); #endif /* _UTILITIES_SERVI_PROTO_H_ */ Index: services.cpp =================================================================== RCS file: /cvsroot/firebird/firebird2/src/utilities/Attic/services.cpp,v retrieving revision 1.9.2.1 retrieving revision 1.9.2.2 diff -b -U3 -r1.9.2.1 -r1.9.2.2 --- services.cpp 29 Aug 2003 13:45:42 -0000 1.9.2.1 +++ services.cpp 31 Aug 2003 09:08:08 -0000 1.9.2.2 @@ -37,8 +37,6 @@ /* Defines */ #define RUNAS_SERVICE " -s" -static void grant_logon_right(TEXT* account); - /* USHORT SERVICES_config(SC_HANDLE manager, TEXT * service_name, @@ -161,7 +159,6 @@ **************************************/ SC_HANDLE service; TEXT path_name[MAXPATHLEN]; - TEXT full_user_name[128]; USHORT len; DWORD errnum; DWORD dwServiceType; @@ -181,24 +178,8 @@ dwServiceType = SERVICE_WIN32_OWN_PROCESS; if (nt_user_name != 0) { - TEXT *p = nt_user_name; - while (*p != '\0' && *p != '\\') ++p; - if (*p == '\0') - { - DWORD cnlen = sizeof(full_user_name); - GetComputerName(full_user_name, &cnlen); - strcat(full_user_name, "\\"); - strncat(full_user_name, nt_user_name, sizeof(full_user_name) - (cnlen + 1)); - } - else - strncpy(full_user_name, nt_user_name, sizeof(full_user_name)); - full_user_name[sizeof(full_user_name) -1] = '\0'; if (nt_user_password == 0) nt_user_password = ""; - nt_user_name = full_user_name; - - // Let's grant "Logon as a Service" right to the -login user - grant_logon_right(nt_user_name); } else dwServiceType |= SERVICE_INTERACTIVE_PROCESS; @@ -317,8 +298,7 @@ return (*err_handler) (errnum, "StartService", NULL); } -/* Wait for the service to actually start before returning. */ - + /* Wait for the service to actually start before returning. */ do { if (!QueryServiceStatus(service, &service_status)) @@ -369,8 +349,7 @@ return (*err_handler) (errnum, "ControlService", NULL); } -/* Wait for the service to actually stop before returning. */ - + /* Wait for the service to actually stop before returning. */ do { if (!QueryServiceStatus(service, &service_status)) @@ -387,13 +366,14 @@ return FB_SUCCESS; } -static void grant_logon_right(TEXT* account) +USHORT SERVICES_grant_logon_right(TEXT* account, + USHORT(*err_handler)(SLONG, TEXT *, SC_HANDLE)) { -/************************************** +/*************************************************** * - * g r a n t _ l o g o n _ r i g h t + * S E R V I C E _ g r a n t _ l o g o n _ r i g h t * - ************************************** + *************************************************** * * Functional description * Grants the "Log on as a service" right to account. @@ -401,11 +381,14 @@ * To run a service under an account other than LocalSystem, the account * must have this right. To succeed granting the right, the current user * must be an Administrator. - * This function does not report errors, which will happen if the right - * as been granted already. + * Returns FB_SUCCESS when actually granted the right. + * Returns FB_LOGON_SRVC_RIGHT_ALREADY_DEFINED if right was already granted + * to the user. + * Returns FB_FAILURE on any error. + * * OM - August 2003 * - **************************************/ + ***************************************************/ LSA_OBJECT_ATTRIBUTES ObjectAttributes; LSA_HANDLE PolicyHandle; @@ -415,14 +398,15 @@ DWORD cchDomain; SID_NAME_USE peUse; LSA_UNICODE_STRING PrivilegeString; + NTSTATUS lsaErr; // Open the policy on the local machine. ZeroMemory(&ObjectAttributes, sizeof(ObjectAttributes)); - if (LsaOpenPolicy(NULL, &ObjectAttributes, - POLICY_CREATE_ACCOUNT | POLICY_LOOKUP_NAMES, &PolicyHandle) + if ((lsaErr = LsaOpenPolicy(NULL, &ObjectAttributes, + POLICY_CREATE_ACCOUNT | POLICY_LOOKUP_NAMES, &PolicyHandle)) != (NTSTATUS)0) { - return; + return (*err_handler)(LsaNtStatusToWinError(lsaErr), "LsaOpenPolicy", NULL); } // Obtain the SID of the user/group. First get required buffer sizes. @@ -431,33 +415,71 @@ pSid = (PSID)LocalAlloc(LMEM_ZEROINIT, cbSid); if (pSid == 0) { + DWORD err = GetLastError(); LsaClose(PolicyHandle); - return; + return (*err_handler)(err, "LocalAlloc(Sid)", NULL); } pDomain = (LPTSTR)LocalAlloc(LMEM_ZEROINIT, cchDomain); if (pDomain == 0) { + DWORD err = GetLastError(); LsaClose(PolicyHandle); LocalFree(pSid); - return; + return (*err_handler)(err, "LocalAlloc(Domain)", NULL); } // Now, really obtain the SID of the user/group. if (LookupAccountName(NULL, account, pSid, &cbSid, pDomain, &cchDomain, &peUse) != 0) { + PLSA_UNICODE_STRING UserRights; + ULONG CountOfRights = 0; + ULONG i; + + LsaEnumerateAccountRights(PolicyHandle, pSid, &UserRights, &CountOfRights); + // Check if the seServiceLogonRight is already granted + for (i = 0; i < CountOfRights; i++) + { + if (wcscmp(UserRights[i].Buffer, L"SeServiceLogonRight") == 0) + break; + } + LsaFreeMemory(UserRights); // Don't leak + if (CountOfRights == 0 || i == CountOfRights) + { // Grant the SeServiceLogonRight to users represented by pSid. PrivilegeString.Buffer = L"SeServiceLogonRight"; PrivilegeString.Length = (USHORT) 19 * sizeof(WCHAR); // 19 : char len of Buffer PrivilegeString.MaximumLength=(USHORT)(19 + 1) * sizeof(WCHAR); - // No need to check the result. - LsaAddAccountRights(PolicyHandle, pSid, &PrivilegeString, 1); + if ((lsaErr = LsaAddAccountRights(PolicyHandle, pSid, &PrivilegeString, 1)) + != (NTSTATUS)0) + { + LsaClose(PolicyHandle); + LocalFree(pSid); + LocalFree(pDomain); + return (*err_handler)(LsaNtStatusToWinError(lsaErr), "LsaAddAccountRights", NULL); + } + } + else + { + LsaClose(PolicyHandle); + LocalFree(pSid); + LocalFree(pDomain); + return FB_LOGON_SRVC_RIGHT_ALREADY_DEFINED; + } + } + else + { + DWORD err = GetLastError(); + LsaClose(PolicyHandle); + LocalFree(pSid); + LocalFree(pDomain); + return (*err_handler)(err, "LookupAccountName", NULL); } LsaClose(PolicyHandle); LocalFree(pSid); LocalFree(pDomain); - return; + return FB_SUCCESS; } // |