AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi sfc.exe mit CreateProcess() starten klappt nicht
Thema durchsuchen
Ansicht
Themen-Optionen

sfc.exe mit CreateProcess() starten klappt nicht

Ein Thema von Shark99 · begonnen am 13. Aug 2015 · letzter Beitrag vom 14. Aug 2015
Antwort Antwort
Shark99

Registriert seit: 16. Mai 2007
403 Beiträge
 
#1

sfc.exe mit CreateProcess() starten klappt nicht

  Alt 13. Aug 2015, 13:11
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.
Angehängte Dateien
Dateityp: zip ConsoleTest.zip (205,3 KB, 10x aufgerufen)
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#2

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

  Alt 14. Aug 2015, 07:33
Zitat:
"Sie müssen als Administrator angemeldet sein und eine Konsolensitzung
ausführen, um das SFC-Hilfsprogramm verwenden zu können."
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

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

  Alt 14. Aug 2015, 09:33
Manifest dazu legen, welches die Ausführung als Administrator erzwingt.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Shark99

Registriert seit: 16. Mai 2007
403 Beiträge
 
#4

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

  Alt 14. Aug 2015, 09:43
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.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

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

  Alt 14. Aug 2015, 10:01
Muss es unbedingt CreateProcess sein?

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

gruss
  Mit Zitat antworten Zitat
Shark99

Registriert seit: 16. Mai 2007
403 Beiträge
 
#6

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

  Alt 14. Aug 2015, 10:19
Danke für den Link (gleiches Problem). Aber was anstatt CreateProcess()?
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

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

  Alt 14. Aug 2015, 10:25
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

Geändert von EWeiss (14. Aug 2015 um 10:38 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

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

  Alt 14. Aug 2015, 10:33
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.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#9

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

  Alt 14. Aug 2015, 11:03
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

Geändert von EWeiss (11. Jul 2019 um 16:02 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:18 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz