Program w c# wykonujący komendę sfc /scannow

Program w c# wykonujący komendę sfc /scannow
Luu888
  • Rejestracja:ponad 5 lat
  • Ostatnio:ponad 2 lata
  • Lokalizacja:Opole
  • Postów:6
0

Część. Potrzebuje napisać program *.exe w c#, który będzie pozwalał na wykonanie sfc /scannow . Poniżej wysyłam kod, który kompiluje i wykonuje jako administrator, ale niestety wyskakuje błąd: Windows Resource Protection could not start the repair service.

Kopiuj
public static void run()
        {
            Process p = new Process();
            ProcessStartInfo info = new ProcessStartInfo();
            info.FileName = "cmd.exe";
            info.RedirectStandardInput = true;
            info.UseShellExecute = false;
            p.StartInfo = info;
            p.Start();
            using (StreamWriter sw = p.StandardInput)
            {
                if (sw.BaseStream.CanWrite)
                {
                    sw.WriteLine("echo on");
                    sw.WriteLine("sfc /scannow");
                    Console.ReadKey();
                }
            }

Prosiłbym o pomoc

edytowany 5x, ostatnio: Luu888
Sarrus
Jak rozumiem ręczne uruchomienie sfc w konsoli nie powoduje problemów?
Luu888
Ręczne uruchomienie nie powoduje problemu
Sarrus
  • Rejestracja:około 14 lat
  • Ostatnio:3 dni
  • Postów:2512
2

Zobacz ten wątek: https://stackoverflow.com/questions/20871514/how-to-launch-sfc-programatically-on-windows-vista-7-8

So I guess the solution to your problem will involve either switching your main program to 64 bit (probably a little drastic), or splicing a 64 bit process into the chain so that the 64 bit sfc can be run.

edytowany 1x, ostatnio: Sarrus
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 4 godziny
1

ale właściwie po co odpalasz cmd.exe i piszesz mu w okno, zamiast odpalić po prostu sfc.exe z odpowiednim parametrem?

Luu888
  • Rejestracja:ponad 5 lat
  • Ostatnio:ponad 2 lata
  • Lokalizacja:Opole
  • Postów:6
0

już tak zrobiłem. jest Ok. zwraca stringa, ale niestety w oknie konsoli nic sie nie wyświetla, a chciałbym widzieć postęp

edytowany 1x, ostatnio: cerrato
Luu888
  • Rejestracja:ponad 5 lat
  • Ostatnio:ponad 2 lata
  • Lokalizacja:Opole
  • Postów:6
0

Jeszcze drugie pytanie. Ten sam kod tylko że w aplikacji konsolowej działa.

Kopiuj
public static void run()
        {
            string snat = Environment.GetEnvironmentVariable("windir") + @"\sysnative\sfc.exe";
            Process p = new Process();
            ProcessStartInfo info = new ProcessStartInfo();
            info.Arguments = "/scannow";
            info.FileName = snat;
            info.RedirectStandardInput = true;
            info.UseShellExecute = false;
            p.StartInfo = info;
            p.Start();
        }

Czy idzie zagnieździć ten program konsolowy (plik exe) w programie okienkowym? Tak żeby był to jeden plik (po skompilowaniu wersji okienkowej).

edytowany 1x, ostatnio: cerrato
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 4 godziny
1
Luu888 napisał(a):
Kopiuj
public static void run()
        {
            string snat = Environment.GetEnvironmentVariable("windir") + @"\sysnative\sfc.exe";

U mnie na 32-bitowym Win10 nie ma żadnego "sysnative", więc jeśli to ma z założenia działać na 32- i na 64-bitowym systemie, to fail.

Luu888
Na 64 bit tylko :)
Azarien
Swoją drogą, ostatnio widzę tendencję że nawet 32-bitowe wersje programów wyraźnie nie są testowane na prawdziwych 32-bitowych systemach - już tyle razy widziałem hardkodowaną ścieżkę C:\Program Files (x86) (a taki katalog u mnie nie istnieje) że musiałem dodać sobie junction do C:\Program Files.
Luu888
  • Rejestracja:ponad 5 lat
  • Ostatnio:ponad 2 lata
  • Lokalizacja:Opole
  • Postów:6
0

Udało mi się to ogarnąć. Zagnieździłem plik exe (podprogram) w głównym programie .

Kod podprogramu:

Kopiuj
static void Main(string[] args)
        {
                 run();
                 delete();
        }
public static void run()
        {
            string snat = Environment.GetEnvironmentVariable("windir") + @"\sysnative\sfc.exe";
            Process p = new Process();
            ProcessStartInfo info = new ProcessStartInfo();
            info.Arguments = "/scannow";
            info.FileName = snat;
            info.RedirectStandardInput = true;
            info.UseShellExecute = false;
            p.StartInfo = info;
            p.Start();
        }
public static void delete()
            {
                Process cmd = new Process();
                cmd.StartInfo.FileName = Environment.ExpandEnvironmentVariables("%SystemRoot%") + @"\System32\cmd.exe";
                cmd.StartInfo.RedirectStandardInput = true;
                cmd.StartInfo.RedirectStandardOutput = true;
                cmd.StartInfo.CreateNoWindow = true;
                cmd.StartInfo.UseShellExecute = false;
                cmd.Start();
                cmd.StandardInput.WriteLine("del skryptsfc.exe");
                cmd.StandardInput.Flush();
                cmd.StandardInput.Close();
                cmd.WaitForExit();
                Console.WriteLine(cmd.StandardOutput.ReadToEnd());
                Console.ReadKey();
        }

kod programu:

Kopiuj
public void dismsfc()
            {
                byte[] exeBytes = Properties.Resources.skryptsfc;
                string exeToRun = @"skryptsfc.exe";
                if (File.Exists(exeToRun))
                    {
                        Process.Start(exeToRun);
                    }
                else
                    {
                        using (FileStream exeFile = new FileStream(exeToRun, FileMode.CreateNew))
                        {
                            exeFile.Write(exeBytes, 0, exeBytes.Length);
                        }

                        using (Process exeProcess = Process.Start(exeToRun))
                        {
                            exeProcess.WaitForExit();
                        }
                    }
            }

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.