открыть диалоговое окно точки восстановления С#

Я пытаюсь открыть диалоговое окно точки восстановления из С#, например

Я использую следующий код:

      Process.Start("SystemPropertiesProtection"); 

и из cmd:

      public static string ExecuteCMD(IEnumerable<string> commands,
                                bool inBackground, 
                                bool runAsAdministrator ,
                                bool WaitProcessForExit)
{
    try 
    { 
        Process p = new Process();
        p.StartInfo.FileName = "cmd.exe";

        if (commands.Any())
        {
            p.StartInfo.Arguments = @" /C " + string.Join("&&", commands);
        }

        if (runAsAdministrator)
        {
            p.StartInfo.Verb = "runas";
        }
                    
        if (inBackground)
        {
            p.StartInfo.CreateNoWindow = true;
            p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
        }
        else
        {
            p.StartInfo.RedirectStandardInput = true;
            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.RedirectStandardError = true;
            p.StartInfo.UseShellExecute = false;
        }

        p.OutputDataReceived += (sender, e) => { MessageBox.Show(e.Data); };
        p.ErrorDataReceived += (sender, e) => { MessageBox.Show(e.Data); };
        p.Start();

        if (WaitProcessForExit)
        {
            p.WaitForExit();
        }
        
        return "";//  p.StandardOutput.ReadToEnd();
    }
    catch (Exception ex)
    { 
        FRM_MSG f = new FRM_MSG();
        f.ShowDLG(" ",
                  ex.Message + "\n" + ex.StackTrace.ToString(),
                  FRM_MSG.MSGIcon.Error,
                  FRM_MSG.BTNS.One,
                  new string[] { "Ok" });
        throw ex;
    }
}
      Executor.ExecuteCMD(new string[] { "SystemPropertiesProtection" }, true, false, false);

и даже создать ярлык для создания точки восстановления, например:

и откройте этот ярлык с помощью:

      Process.Start(RestorePointShortcutFilePath);

но они всегда открывают три вкладки и не открывают вкладку точки восстановления

Как открыть диалоговое окно точки восстановления, как показано на первом изображении, которое имеет 5 вкладок, а не 3, моя ОС — Windows 7 64-разрядная? Спасибо.

2 ответа

Проблема, которую вы видите, связана с , который возникает из-за того, что вы запускаете свою программу как 32-разрядную в своей 64-разрядной ОС. Таким образом, вы выполняете%windir%\SysWOW64\SystemPropertiesProtection.exe(например: C:\Windows\SysWOW64\SystemPropertiesProtection.exe).

Есть несколько способов избежать этой проблемы. Снимите флажок «Предпочитать 32-разрядную версию» (Проект => <имя проекта> Свойства => Сборка => снимите флажок «Предпочитать 32-разрядную версию»). Скомпилируйте как x64 или проверьте, работает ли ваше приложение как 32-разрядное в 64-разрядной ОС. Если это так, установите соответствующее полное имя файла.

В документации указано:

32-разрядные приложения могут получить доступ к собственному системному каталогу, заменив %windir%\System32 на %windir%\Sysnative. WOW64 распознает Sysnative как специальный псевдоним, используемый для указания того, что файловая система не должна перенаправлять доступ. Этот механизм является гибким и простым в использовании, поэтому рекомендуется использовать его для обхода перенаправления файловой системы. Обратите внимание, что 64-разрядные приложения не могут использовать псевдоним Sysnative, так как это виртуальный каталог, а не реальный.


Попробуйте следующее:

Создайте новое приложение Windows Forms (.NET Framework)

Добавьте манифест приложения в свой проект

Примечание . Это используется, чтобы предложить пользователю выполнить программу от имени администратора.

  • В меню VS нажмите «Проект» .
  • Выберите Добавить новый элемент...
  • Выберите файл манифеста приложения (только для Windows)
  • Нажмите Добавить

В app.manifest замените

      <requestedExecutionLevel level="asInvoker" uiAccess="false" />

с

      <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />

Добавьте следующие директивы using :

  • using System.IO;
  • using System.Diagnostics;
      private void OpenSystemPropertiesProtection()
{
    string filename = System.IO.Path.Combine(Environment.GetEnvironmentVariable("windir"), "System32", "SystemPropertiesProtection.exe");

    //environment variable windir has the same value as SystemRoot
    //use 'Sysnative' to access 64-bit files (in System32) if program is running as 32-bit process
    //use 'SysWow64' to access 32-bit files on 64-bit OS

    if (Environment.Is64BitOperatingSystem && !Environment.Is64BitProcess)
        filename = System.IO.Path.Combine(Environment.GetEnvironmentVariable("windir"), "SysNative", "SystemPropertiesProtection.exe");
    
    Debug.WriteLine($"filename: {filename}");

    ProcessStartInfo startInfo = new ProcessStartInfo(filename);
    startInfo.UseShellExecute = true;
    startInfo.WorkingDirectory = System.IO.Path.GetDirectoryName(filename);

    Process.Start(startInfo);
}

Ресурсы :

Используйте ShellExecute для выполнения команды.

      ProcessStartInfo info = new ProcessStartInfo();
info.FileName = "SystemPropertiesProtection";
info.UseShellExecute = true;

Process.Start(info);

Я тестировал это в Windows 11, но, вероятно, оно будет работать и в Windows 7. Имейте в виду, что срок службы Windows 7 истек еще в 2020 году. Его больше нельзя использовать.

Другие вопросы по тегам