CreateProcess mit CMD in Konsolenanwendung



  • Hallo zusammen,
    ich sitze seit gestern an einem Problem welches ich nie für möglich gehalten hätte. Ich versuche mit CreateProcess die Windows Server eigene Sicherung namens WBAdmin zu starten aber leider ohne Erfolg. Egal ob ich mit absoluten Pfad und Parameterübergabe auf WBAdmin direkt mit CreateProcess zugreife oder in folgendem Beispiel über die CMD gehe, wird über die Unnamed Pipe immer "Der Befehl wbadmin kann nicht gefunden werden...blabla" ausgegeben. Wohlgemerkt aus einer laufenden CMD welche mit CreateProcess gestartet wurde. Starte ich die CMD direkt ausserhalb jeglichen Codes funktioniert natürlich alles. Habe ich hier ein Usercontextproblem oder ist das "Environment" CMD über CreateProcess zu starten ein anderes? Setze ich spasseshalber "ping 127.0.0.1" funktioniert alles wunderbar. Stehe total aufm Schlauch......

    bool ShareBackup::StartProcess(struct BackupParams *params)
    {
    
    		   //----create command
    		   AnsiString command = "cmd /C wbadmin start backup -allCritical -include:" + params->Volumes +
    		   " -backuptarget:" + params->Pfad + "\\" + params->ActualDate + " -vssfull -quiet";
    
    		  //--create pipe for the console standard output
    		  SECURITY_ATTRIBUTES sa;
    		  HANDLE ReadPipeHandle;
    		  HANDLE WritePipeHandle;
    
    		  ZeroMemory(&sa,sizeof(SECURITY_ATTRIBUTES));
    		  sa.nLength=sizeof(SECURITY_ATTRIBUTES);
    		  sa.bInheritHandle=true;
    		  sa.lpSecurityDescriptor=NULL;
    
    		  if(!CreatePipe(&ReadPipeHandle,&WritePipeHandle,&sa,0))
    		  return false;
    
    		  //--Create a Console
    		  STARTUPINFO si;
    		  ZeroMemory(&si,sizeof(STARTUPINFO));
    		  si.cb=sizeof(STARTUPINFO);
    		  si.dwFlags=STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
    		  si.wShowWindow=SW_HIDE;
    		  si.hStdOutput=WritePipeHandle;
    		  si.hStdError=WritePipeHandle;
    
    		  PROCESS_INFORMATION pi;
    		  ZeroMemory(&pi,sizeof(PROCESS_INFORMATION));
    
    		  if(!CreateProcess(NULL,command.c_str(),NULL,NULL,true,0,NULL,NULL,&si,&pi))
    		  return false;
    ...
    ......
    ..........
    


  • Sogar system() schlägt mit wbadmin fehl (Befehl wbadmin konnte nicht gefunden werden):

    AnsiString systemcommand = "wbadmin start backup -allCritical -include:" + params->Volumes +
    		   " -backuptarget:" + params->Pfad + "\\" + params->ActualDate + " -vssfull -quiet";
    
    		   system(systemcommand.c_str());
    

    Dies funktioniert:

    system("dir"); //oder system("ping 127.0.0.1");
    

    Was läuft denn hier falsch 😕



  • Habe herausgefunden woran es liegt. Die 32-Bit Applikation landet beim Aufruf im SysWOW64 Verzeichnis und dort gibt es kein WBAdmin.

    Edit: C:\\Windows\\Sysnative\\ ist mein Freund.


Anmelden zum Antworten