открыть диалоговое окно точки восстановления С#
Я пытаюсь открыть диалоговое окно точки восстановления из С#, например
Я использую следующий код:
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 году. Его больше нельзя использовать.