Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi sfc.exe mit CreateProcess() starten klappt nicht (https://www.delphipraxis.net/186208-sfc-exe-mit-createprocess-starten-klappt-nicht.html)

Shark99 13. Aug 2015 13:11

sfc.exe mit CreateProcess() starten klappt nicht
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich versuche unter Delphi 7 sfc.exe /verifyonly mit CreateProcess zu starten und die Ausgabe in ein TMemo umzuleiten. Den Code dazu habe ich hier im Forum gefunden. Es klappt jedoch nicht. Wenn ich mit cmd.exe eine Console aufmache und sfc.exe /verifyonly starte kommt Beginning system scan. This process will take some time. Mache ich es über meine App, dann kommt statt dessen Windows Resource Protection could not start the repair service. Es kann nicht an Zugriffsrechten liegen, weil bei meinem Win7 x64 UAC aus ist. Woran liegt es? Habe Beispielprojekt angehängt.
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Memo2: TMemo;
    Edit1: TEdit;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function GetConsoleOutput(const Command: String; var Output,Errors: TMemo): Boolean;
var
  StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;
  SecurityAttr: TSecurityAttributes;
  PipeOutputRead: THandle;
  PipeOutputWrite: THandle;
  PipeErrorsRead: THandle;
  PipeErrorsWrite: THandle;
  Succeed: Boolean;
  Buffer: array [0..255] of Char;
  NumberOfBytesRead: DWORD;
  Stream: TMemoryStream;
begin
  //Initialisierung ProcessInfo
  FillChar(ProcessInfo, SizeOf(TProcessInformation), 0);

  //Initialisierung SecurityAttr
  FillChar(SecurityAttr, SizeOf(TSecurityAttributes), 0);
  SecurityAttr.nLength := SizeOf(SecurityAttr);
  SecurityAttr.bInheritHandle := true;
  SecurityAttr.lpSecurityDescriptor := nil;

  //Pipes erzeugen
  CreatePipe(PipeOutputRead, PipeOutputWrite, @SecurityAttr, 0);
  CreatePipe(PipeErrorsRead, PipeErrorsWrite, @SecurityAttr, 0);

  //Initialisierung StartupInfo
  FillChar(StartupInfo, SizeOf(TStartupInfo), 0);
  StartupInfo.cb:=SizeOf(StartupInfo);
  StartupInfo.hStdInput := 0;
  StartupInfo.hStdOutput := PipeOutputWrite;
  StartupInfo.hStdError := PipeErrorsWrite;
  StartupInfo.wShowWindow := sw_Hide;
  StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;

  if CreateProcess(nil, PChar(Command), nil, nil, true,
  CREATE_DEFAULT_ERROR_MODE or CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil,
  StartupInfo, ProcessInfo) then begin
    result:=true;
    //Write-Pipes schließen
    CloseHandle(PipeOutputWrite);
    CloseHandle(PipeErrorsWrite);

    //Ausgabe Read-Pipe auslesen
    Stream := TMemoryStream.Create;
    try
      while true do begin
        succeed := ReadFile(PipeOutputRead, Buffer, 255, NumberOfBytesRead, nil);
        if not succeed then break;
        Stream.Write(Buffer, NumberOfBytesRead);
      end;
      Stream.Position := 0;
      Output.Lines.LoadFromStream(Stream);
    finally
      Stream.Free;
    end;
    CloseHandle(PipeOutputRead);

    //Fehler Read-Pipe auslesen
    Stream := TMemoryStream.Create;
    try
      while true do begin
        succeed := ReadFile(PipeErrorsRead, Buffer, 255, NumberOfBytesRead, nil);
        if not succeed then break;
        Stream.Write(Buffer, NumberOfBytesRead);
      end;
      Stream.Position := 0;
      Errors.Lines.LoadFromStream(Stream);
    finally
      Stream.Free;
    end;
    CloseHandle(PipeErrorsRead);

    WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
    CloseHandle(ProcessInfo.hProcess);
  end
  else begin
    result:=false;
    CloseHandle(PipeOutputRead);
    CloseHandle(PipeOutputWrite);
    CloseHandle(PipeErrorsRead);
    CloseHandle(PipeErrorsWrite);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  GetConsoleOutput(edit1.Text,memo1,memo2);
end;

end.

hathor 14. Aug 2015 07:33

AW: sfc.exe mit CreateProcess() starten klappt nicht
 
Zitat:
"Sie müssen als Administrator angemeldet sein und eine Konsolensitzung
ausführen, um das SFC-Hilfsprogramm verwenden zu können."

Luckie 14. Aug 2015 09:33

AW: sfc.exe mit CreateProcess() starten klappt nicht
 
Manifest dazu legen, welches die Ausführung als Administrator erzwingt.

Shark99 14. Aug 2015 09:43

AW: sfc.exe mit CreateProcess() starten klappt nicht
 
Ich bin als Admin eingelogt, und UAC is aus, also wird doch alles automatisch mit Admin rechten ausgeführt. cmd.exe zeigt soft in der Caption Administrator an.

EWeiss 14. Aug 2015 10:01

AW: sfc.exe mit CreateProcess() starten klappt nicht
 
Muss es unbedingt CreateProcess sein?

http://stackoverflow.com/questions/2...dows-vista-7-8

gruss

Shark99 14. Aug 2015 10:19

AW: sfc.exe mit CreateProcess() starten klappt nicht
 
Danke für den Link (gleiches Problem). Aber was anstatt CreateProcess()?

EWeiss 14. Aug 2015 10:25

AW: sfc.exe mit CreateProcess() starten klappt nicht
 
Zitat:

Zitat von Shark99 (Beitrag 1312129)
Danke für den Link (gleiches Problem). Aber was anstatt CreateProcess()?

Verstehe ich nicht.
Er sagt das es gut funktioniert.

Zitat:

With all the help here I ended up with this and it worked fine on 8.1 x64. Thank you all very much!
Kann es leider nicht testen da ich kein W8.1 verwende.

Unter Win7
Zitat:

Systemsuche wird gestartet. Dieser Vorgang kann einige Zeit dauern.
Derzeit wird ein weiterer Wartungs- oder Reparaturvorgang ausgefhrt. Warten
Sie, bis der Vorgang abgeschlossen ist, und fhren Sie "sfc" erneut aus.
gruss

Der schöne Günther 14. Aug 2015 10:33

AW: sfc.exe mit CreateProcess() starten klappt nicht
 
Zitat:

Zitat von Shark99 (Beitrag 1312127)
Ich bin als Admin eingelogt, und UAC is aus, also wird doch alles automatisch mit Admin rechten ausgeführt.

Also einer von uns beiden muss falsch liegen. Denn ich meine dass das nicht stimmt. Das Standard RAD-Studio Manifest sagt "asInvoker". Und damit hätte deine Anwendung keine Adminrechte.

EWeiss 14. Aug 2015 11:03

AW: sfc.exe mit CreateProcess() starten klappt nicht
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1312131)
Zitat:

Zitat von Shark99 (Beitrag 1312127)
Ich bin als Admin eingelogt, und UAC is aus, also wird doch alles automatisch mit Admin rechten ausgeführt.

Also einer von uns beiden muss falsch liegen. Denn ich meine dass das nicht stimmt. Das Standard RAD-Studio Manifest sagt "asInvoker". Und damit hätte deine Anwendung keine Adminrechte.

Korrekt.. ;)
Und mit dem Manifest funktioniert die verlinkte Anwendung auch.

TrustedInstaller wird gestartet.

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:04 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz