Windows 7 CreateProcess,子进程无法写入文件?

时间:2012-02-09 04:05:34

标签: windows createprocess

我很困惑。我有一个程序,我作为非管理员用户运行。该程序可以在我的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.

2 个答案:

答案 0 :(得分:1)

你正在推出64位的应用程序?对于32个进程,Windows将re-direct writes to Program Files%localappdata%\VirtualStore,因此它们会成功但不会对64位进程执行相同的操作。

答案 1 :(得分:0)

道歉 - 主程序也无法创建文件。主要程序是从以管理员身份运行的安装程序启动的,这个问题让人感到困惑。系统然后重新启动,主程序使用当前用户的访问权限自动启动..谁没有访问该文件夹。