Некорректно работает bat-файл. C#
Есть bat-файл который изменяет реестр в разделе LocalMachine. Использую его, потому-что в Registry.LocalMachine нельзя удалять или создавать разделы.
Код bat-файла:
reg delete "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\RemoteComputer\NameSpace\{863aa9fd-42df-457b-8e4d-0de1b8015c60}" /f
И есть код который запускает его. Но есть одна проблема, когда приложения выполняет bat-файл, то пишет: не удаётся найти указанный раздел или параметр в реестре. Если bat-файл запустить вручную, то всё работает. Что делать?
Код запуска bat-файла:
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.StartInfo.FileName = "cmd.exe";
proc.StartInfo.Arguments = "/k cd " + Application.StartupPath + "/Bin & -searchprinters.bat";
proc.StartInfo.WorkingDirectory = @"C:\Programs";
proc.Start();
Скриншот проблемы (запустил без прав, но работает):
Ответы (2 шт):
У вас наверняка целевая архитектура сборки Any CPU.
Попробуйте через Registry.LocalMachine, но соберите приложение под x64 архитектуру процессора. .bat файл тоже должен заработать.
Проблема кроется в WOW64 виртуализации на 64-битной операционной системе для 32-битных приложений, подробности здесь.
Вылечить без изменения архитектуры сборки тоже можно, но это уже сложнее.
Дабы не быть голословным пример с реального проекта. приложение 32х битное билд х86, т.к. библиотеки сдк 32х битные. но нужно при старте настраивать в реестре поведение смарткарт при поднесении к считывателю. но драйвера 64х битные ( у считывателя ) поэтому была задача в обоих ветвях реестра править данные.
public static Process RunAsAdmin(string aFileName, string anArguments,ProcessWindowStyle style=ProcessWindowStyle.Normal,String dir=null)
{
System.Diagnostics.ProcessStartInfo processInfo = new System.Diagnostics.ProcessStartInfo();
if(dir!=null)
processInfo.WorkingDirectory = dir;
processInfo.FileName = aFileName;
processInfo.Arguments = anArguments;
processInfo.UseShellExecute = true;
processInfo.WindowStyle = style;
processInfo.Verb = "runas"; // здесь вся соль
return System.Diagnostics.Process.Start(processInfo);
}
void public static createKeys()
{
RunAsAdmin("reg", @"ADD HKLM\SOFTWARE\Microsoft\Cryptography\Calais\SmartCards\Unknown /reg:32 /f", System.Diagnostics.ProcessWindowStyle.Hidden);
RunAsAdmin("reg", @"ADD HKLM\SOFTWARE\Microsoft\Cryptography\Calais\SmartCards\Unknown /reg:64 /f", System.Diagnostics.ProcessWindowStyle.Hidden);
RunAsAdmin("reg", @"ADD HKLM\SOFTWARE\Microsoft\Cryptography\Calais\SmartCards\Unknown /v ATR /t REG_BINARY /d 0003 /reg:32 /f", System.Diagnostics.ProcessWindowStyle.Hidden);
RunAsAdmin("reg", @"ADD HKLM\SOFTWARE\Microsoft\Cryptography\Calais\SmartCards\Unknown /v ATRMASK /t REG_BINARY /d ffff /reg:32 /f", System.Diagnostics.ProcessWindowStyle.Hidden);
RunAsAdmin("reg", @"ADD HKLM\SOFTWARE\Microsoft\Cryptography\Calais\SmartCards\Unknown /v ATR /t REG_BINARY /d 0003 /reg:64 /f", System.Diagnostics.ProcessWindowStyle.Hidden);
RunAsAdmin("reg", @"ADD HKLM\SOFTWARE\Microsoft\Cryptography\Calais\SmartCards\Unknown /v ATRMASK /t REG_BINARY /d ffff /reg:64 /f", System.Diagnostics.ProcessWindowStyle.Hidden);
RunAsAdmin("reg", @"ADD HKLM\SOFTWARE\Microsoft\Cryptography\Calais\SmartCards\Unknown /v ""Crypto Provider"" /t REG_SZ /d TEST /reg:32 /f", System.Diagnostics.ProcessWindowStyle.Hidden);
RunAsAdmin("reg", @"ADD HKLM\SOFTWARE\Microsoft\Cryptography\Calais\SmartCards\Unknown /v ""Crypto Provider"" /t REG_SZ /d TEST /reg:64 /f", System.Diagnostics.ProcessWindowStyle.Hidden);
}
