Windows 7 CreateProcess,子进程无法写入文件?
Posted
技术标签:
【中文标题】Windows 7 CreateProcess,子进程无法写入文件?【英文标题】:Windows 7 CreateProcess, child process cannot write file? 【发布时间】:2012-02-09 04:05:34 【问题描述】:我很困惑。我有以非管理员用户身份运行的程序。该程序可以在我的 C:\Program Files\ 文件夹中写入文件。
但是,如果我在第一个程序中使用 CreateProcess 启动第二个程序,则第二个程序无法写入 C:\Program Files\ 文件夹。
传递给 CreateProcess() 以使用与第一个启动程序相同的访问权限的正确参数是什么?我尝试将第 3 和第 4 个参数设置为 NULL,但这似乎不起作用。
BOOL RunCmd( char *pCmd,
char *pParams,
char *pWorkingDir,
int nWaitSecs,
BOOL fQuietMode,
DWORD *pdwExitCode )
BOOL fSuccess = TRUE;
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof(si) );
ZeroMemory( &pi, sizeof(pi) );
si.cb = sizeof( si );
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = ( fQuietMode ) ? SW_HIDE : SW_SHOW;
// PDS: This is the important stuff - file handle needs to be inheritable..
SECURITY_ATTRIBUTES sFileSecurity;
ZeroMemory( &sFileSecurity, sizeof( sFileSecurity ) );
sFileSecurity.nLength = sizeof( sFileSecurity );
sFileSecurity.bInheritHandle = TRUE;
char txCmdLine[ MAX_PATH * 2 ];
strcpy( txCmdLine, "\"" );
strcat( txCmdLine, pCmd );
strcat( txCmdLine, "\"" );
if( pParams )
// PDS: Add any parameters if we have them..
strcat( txCmdLine, " " );
strcat( txCmdLine, pParams );
int rc;
// Start the child process.
rc = CreateProcess( NULL, // No module name (use command line).
txCmdLine, // Command line.
&sFileSecurity, // Process handle not inheritable.
&sFileSecurity, // Thread handle not inheritable.
FALSE,
// PDS: Don't pop up window for application.. quiet mode!
CREATE_NO_WINDOW,
NULL, // Use parent's environment block.
pWorkingDir, // Working folder
&si, // Pointer to STARTUPINFO structure.
&pi ); // Pointer to PROCESS_INFORMATION structure.
【问题讨论】:
【参考方案1】:您要启动的应用程序是 64 位的吗?对于 32 个进程,Windows 将 re-direct writes to Program Files 到 %localappdata%\VirtualStore
,因此它们会成功,但它不会对 64 位进程执行相同的操作。
【讨论】:
感谢您的回复。它是在 32 位笔记本电脑上运行的 32 位进程。我确实遇到了尝试在 VirtualStore 中创建文件的问题。用 VS2010 重新编译辅助程序后,我用 ProcMon.exe 确认 CreateFile() 调用现在肯定发生在 C:\Program Files\抱歉 - 主程序也无法创建文件。主程序是从以管理员身份运行的安装程序启动的这一事实使这个问题感到困惑。然后系统重新启动,主程序使用当前用户的访问权限自动启动......谁没有访问该文件夹的权限。
【讨论】:
以上是关于Windows 7 CreateProcess,子进程无法写入文件?的主要内容,如果未能解决你的问题,请参考以下文章
CreateProcess 无法在 Windows 7 中启动 Adobe Reader
C++ CreateProcess 无法从 Windows 7 上的套接字接收路径 (64)