Re: initdb failed on Windows 2000 - Mailing list pgsql-hackers
From | Yoshiyuki Asaba |
---|---|
Subject | Re: initdb failed on Windows 2000 |
Date | |
Msg-id | 20070829.163806.220052165.y-asaba@sraoss.co.jp Whole thread Raw |
In response to | initdb failed on Windows 2000 (Yoshiyuki Asaba <y-asaba@sraoss.co.jp>) |
Responses |
Re: initdb failed on Windows 2000
|
List | pgsql-hackers |
Hi, From: Yoshiyuki Asaba <y-asaba@sraoss.co.jp> Subject: [HACKERS] initdb failed on Windows 2000 Date: Mon, 27 Aug 2007 20:46:35 +0900 (JST) > I have compiled PostgreSQL 8.2.4 with MinGW on Windows 2000. Then I > have executed initdb as Administrator. However initdb failed with the > following message. > > ---- > The program "postgres" is needed by initdb but was not found in the > same directory as "C:\msys\1.0\local\pgsql\bin/initdb". > Check your installation. > ---- > > So, I have debugged initdb.exe. I found that CreatePipe() was failed > with ERROR_ACCESS_DENIED in exec.c:pipe_read_line(). The attached files are test programs. % gcc -o child.exe child.c % gcc -o parent.exe parent.c When parent.exe is executed by Power Users or Users, the result is good. However, CreatePipe() is failed when Administrator do. % ./parent.exe CreatePipe() failed: 5 Regards, -- Yoshiyuki Asaba y-asaba@sraoss.co.jp #include <stdio.h> #include <windows.h> typedef BOOL(WINAPI * __CreateRestrictedToken) (HANDLE, DWORD, DWORD, PSID_AND_ATTRIBUTES, DWORD, PLUID_AND_ATTRIBUTES,DWORD, PSID_AND_ATTRIBUTES, PHANDLE); #define DISABLE_MAX_PRIVILEGE 0x1 /** Create a restricted token and execute the specified process with it.** Returns 0 on failure, non-zero on success, sameas CreateProcess().** On NT4, or any other system not containing the required functions, will* NOT execute anything.*/ static int CreateRestrictedProcess(char *cmd) {BOOL b;STARTUPINFO si;HANDLE origToken;HANDLE restrictedToken;SID_IDENTIFIER_AUTHORITY NtAuthority= {SECURITY_NT_AUTHORITY};SID_AND_ATTRIBUTES dropSids[2];__CreateRestrictedToken _CreateRestrictedToken = NULL;HANDLE Advapi32Handle;PROCESS_INFORMATION pi; ZeroMemory(&pi, sizeof(pi));ZeroMemory(&si, sizeof(si));si.cb = sizeof(si); Advapi32Handle = LoadLibrary("ADVAPI32.DLL");if (Advapi32Handle != NULL){ _CreateRestrictedToken = (__CreateRestrictedToken)GetProcAddress(Advapi32Handle, "CreateRestrictedToken");} if (_CreateRestrictedToken == NULL){ fprintf(stderr, "WARNING: Unable to create restricted tokens on this platform\n"); if (Advapi32Handle != NULL) FreeLibrary(Advapi32Handle); return 0;} /* Open the current token to use as a base for the restricted one */if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS,&origToken)){ fprintf(stderr, "Failed to open process token: %lu\n", GetLastError()); return 0;} /* Allocate list of SIDs to remove */ZeroMemory(&dropSids, sizeof(dropSids));if (!AllocateAndInitializeSid(&NtAuthority,2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &dropSids[0].Sid) || !AllocateAndInitializeSid(&NtAuthority, 2,SECURITY_BUILTIN_DOMAIN_RID,DOMAIN_ALIAS_RID_POWER_USERS, 0, 0, 0, 0, 0, 0, &dropSids[1].Sid)){ fprintf(stderr, "Failed to allocate SIDs: %lu\n", GetLastError()); return 0;} b = _CreateRestrictedToken(origToken, DISABLE_MAX_PRIVILEGE, sizeof(dropSids)/ sizeof(dropSids[0]), dropSids, 0, NULL, 0, NULL, &restrictedToken); FreeSid(dropSids[1].Sid);FreeSid(dropSids[0].Sid);CloseHandle(origToken);FreeLibrary(Advapi32Handle); if (!b){ fprintf(stderr, "Failed to create restricted token: %lu\n", GetLastError()); return 0;} CreateProcessAsUser(restrictedToken, NULL, cmd, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi); WaitForSingleObject(pi.hProcess,INFINITE);CloseHandle(pi.hThread);CloseHandle(pi.hProcess);return 0; } int main(void) {CreateRestrictedProcess("child.exe");return 0; } #include <stdio.h> #include <windows.h> int main(void) { SECURITY_ATTRIBUTES sattr;HANDLE childstdoutrd, childstdoutwr, childstdoutrddup, file,pipe;PROCESS_INFORMATION pi;STARTUPINFO si; sattr.nLength = sizeof(SECURITY_ATTRIBUTES);sattr.bInheritHandle = TRUE;sattr.lpSecurityDescriptor = NULL; SetLastError(0); if (!CreatePipe(&childstdoutrd, &childstdoutwr, &sattr, 0)) printf("CreatePipe() failed: %lu\n",GetLastError()); else puts("ok"); CloseHandle(childstdoutrd); CloseHandle(childstdoutwr); return 0; }
pgsql-hackers by date: