Некорректно работает 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();

Скриншот проблемы (запустил без прав, но работает):

Выполнение bat-файлов


Ответы (2 шт):

Автор решения: aepot

У вас наверняка целевая архитектура сборки Any CPU.

Попробуйте через Registry.LocalMachine, но соберите приложение под x64 архитектуру процессора. .bat файл тоже должен заработать.

Проблема кроется в WOW64 виртуализации на 64-битной операционной системе для 32-битных приложений, подробности здесь.

Вылечить без изменения архитектуры сборки тоже можно, но это уже сложнее.

→ Ссылка
Автор решения: Yakov

Дабы не быть голословным пример с реального проекта. приложение 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);
}
→ Ссылка