44 *
55 * Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
66 *
7- * $PostgreSQL: pgsql/src/bin/pg_ctl/pg_ctl.c,v 1.107 2009/01/15 22:33:19 petere Exp $
7+ * $PostgreSQL: pgsql/src/bin/pg_ctl/pg_ctl.c,v 1.108 2009/01/28 11:19:37 mha Exp $
88 *
99 *-------------------------------------------------------------------------
1010 */
@@ -121,7 +121,7 @@ static void pgwin32_SetServiceStatus(DWORD);
121121static void WINAPI pgwin32_ServiceHandler (DWORD );
122122static void WINAPI pgwin32_ServiceMain (DWORD ,LPTSTR * );
123123static void pgwin32_doRunAsService (void );
124- static int CreateRestrictedProcess (char * cmd ,PROCESS_INFORMATION * processInfo );
124+ static int CreateRestrictedProcess (char * cmd ,PROCESS_INFORMATION * processInfo , bool as_service );
125125
126126static SERVICE_STATUS status ;
127127static SERVICE_STATUS_HANDLE hStatus = (SERVICE_STATUS_HANDLE )0 ;
@@ -385,7 +385,7 @@ start_postmaster(void)
385385snprintf (cmd ,MAXPGPATH ,"CMD /C " SYSTEMQUOTE "\"%s\" %s%s < \"%s\" 2>&1" SYSTEMQUOTE ,
386386postgres_path ,pgdata_opt ,post_opts ,DEVNULL );
387387
388- if (!CreateRestrictedProcess (cmd ,& pi ))
388+ if (!CreateRestrictedProcess (cmd ,& pi , false ))
389389return GetLastError ();
390390CloseHandle (pi .hProcess );
391391CloseHandle (pi .hThread );
@@ -1210,7 +1210,7 @@ pgwin32_ServiceMain(DWORD argc, LPTSTR * argv)
12101210
12111211/* Start the postmaster */
12121212pgwin32_SetServiceStatus (SERVICE_START_PENDING );
1213- if (!CreateRestrictedProcess (pgwin32_CommandLine (false),& pi ))
1213+ if (!CreateRestrictedProcess (pgwin32_CommandLine (false),& pi , true ))
12141214{
12151215pgwin32_SetServiceStatus (SERVICE_STOPPED );
12161216return ;
@@ -1313,7 +1313,7 @@ typedefBOOL(WINAPI * __QueryInformationJobObject) (HANDLE, JOBOBJECTINFOCLASS,
13131313 * automatically destroyed when pg_ctl exits.
13141314 */
13151315static int
1316- CreateRestrictedProcess (char * cmd ,PROCESS_INFORMATION * processInfo )
1316+ CreateRestrictedProcess (char * cmd ,PROCESS_INFORMATION * processInfo , bool as_service )
13171317{
13181318int r ;
13191319BOOL b ;
@@ -1449,6 +1449,7 @@ CreateRestrictedProcess(char *cmd, PROCESS_INFORMATION * processInfo)
14491449JOBOBJECT_BASIC_LIMIT_INFORMATION basicLimit ;
14501450JOBOBJECT_BASIC_UI_RESTRICTIONS uiRestrictions ;
14511451JOBOBJECT_SECURITY_LIMIT_INFORMATION securityLimit ;
1452+ OSVERSIONINFO osv ;
14521453
14531454ZeroMemory (& basicLimit ,sizeof (basicLimit ));
14541455ZeroMemory (& uiRestrictions ,sizeof (uiRestrictions ));
@@ -1459,8 +1460,23 @@ CreateRestrictedProcess(char *cmd, PROCESS_INFORMATION * processInfo)
14591460_SetInformationJobObject (job ,JobObjectBasicLimitInformation ,& basicLimit ,sizeof (basicLimit ));
14601461
14611462uiRestrictions .UIRestrictionsClass = JOB_OBJECT_UILIMIT_DESKTOP |JOB_OBJECT_UILIMIT_DISPLAYSETTINGS |
1462- JOB_OBJECT_UILIMIT_EXITWINDOWS |JOB_OBJECT_UILIMIT_HANDLES | JOB_OBJECT_UILIMIT_READCLIPBOARD |
1463+ JOB_OBJECT_UILIMIT_EXITWINDOWS |JOB_OBJECT_UILIMIT_READCLIPBOARD |
14631464JOB_OBJECT_UILIMIT_SYSTEMPARAMETERS |JOB_OBJECT_UILIMIT_WRITECLIPBOARD ;
1465+
1466+ if (as_service )
1467+ {
1468+ osv .dwOSVersionInfoSize = sizeof (osv );
1469+ if (!GetVersionEx (& osv )||
1470+ osv .dwMajorVersion < 6 ||
1471+ (osv .dwMajorVersion == 6 && osv .dwMinorVersion == 0 ))
1472+ {
1473+ /*
1474+ * On Windows 7 (and presumably later), JOB_OBJECT_UILIMIT_HANDLES prevents us from
1475+ * starting as a service. So we only enable it on Vista and earlier (version <= 6.0)
1476+ */
1477+ uiRestrictions .UIRestrictionsClass |=JOB_OBJECT_UILIMIT_HANDLES ;
1478+ }
1479+ }
14641480_SetInformationJobObject (job ,JobObjectBasicUIRestrictions ,& uiRestrictions ,sizeof (uiRestrictions ));
14651481
14661482securityLimit .SecurityLimitFlags = JOB_OBJECT_SECURITY_NO_ADMIN |JOB_OBJECT_SECURITY_ONLY_TOKEN ;