Regedit создает ключ только вручную, но не при вызове из c # -программы - PullRequest
0 голосов
/ 31 октября 2019

Я получил файл .reg: «C: \ Program Files (x86) \ Informatik \ Access \ NetCode \ SmartCard.reg» со следующим содержимым:

REGEDIT4

[HKEY_CURRENT_USER\Software\Classes\CLSID\{6Z72B1AB-31CA-4852-9552-39E149C6D6D9}]
@="SmartCard.SmartCardValidator"

[HKEY_CURRENT_USER\Software\Classes\CLSID\{6Z72B1AB-31CA-4852-9552-39E149C6D6D9}\InprocServer32]
@="mscoree.dll"
"ThreadingModel"="Both"
"Class"="SmartCard.SmartCardValidator"
"Assembly"="SmartCard, Version=1.0.0.0, Culture=neutral, PublicKeyToken=8eb9c4ad764487a4"
"RuntimeVersion"="v4.0.30319"
"CodeBase"="file:///C:/Program Files (x86)/Informatik/Access/../NetCode/SmartCard.dll"

[HKEY_CURRENT_USER\Software\Classes\CLSID\{6Z72B1AB-31CA-4852-9552-39E149C6D6D9}\InprocServer32\1.0.0.0]
"Class"="SmartCard.SmartCardValidator"
"Assembly"="SmartCard, Version=1.0.0.0, Culture=neutral, PublicKeyToken=8eb9c4ad764487a4"
"RuntimeVersion"="v4.0.30319"
"CodeBase"="file:///C:/Program Files (x86)/Informatik/Access/../NetCode/SmartCard.dll"

[HKEY_CURRENT_USER\Software\Classes\CLSID\{6Z72B1AB-31CA-4852-9552-39E149C6D6D9}\ProgId]
@="SmartCard.SmartCardValidator"



[HKEY_CURRENT_USER\Software\Classes\Wow6432Node\CLSID\{6Z72B1AB-31CA-4852-9552-39E149C6D6D9}]
@="SmartCard.SmartCardValidator"

[HKEY_CURRENT_USER\Software\Classes\Wow6432Node\CLSID\{6Z72B1AB-31CA-4852-9552-39E149C6D6D9}\InprocServer32]
@="mscoree.dll"
"ThreadingModel"="Both"
"Class"="SmartCard.SmartCardValidator"
"Assembly"="SmartCard, Version=1.0.0.0, Culture=neutral, PublicKeyToken=8eb9c4ad764487a4"
"RuntimeVersion"="v4.0.30319"
"CodeBase"="file:///C:/Program Files (x86)/Informatik/Access/../NetCode/SmartCard.dll"

[HKEY_CURRENT_USER\Software\Classes\Wow6432Node\CLSID\{6Z72B1AB-31CA-4852-9552-39E149C6D6D9}\InprocServer32\1.0.0.0]
"Class"="SmartCard.SmartCardValidator"
"Assembly"="SmartCard, Version=1.0.0.0, Culture=neutral, PublicKeyToken=8eb9c4ad764487a4"
"RuntimeVersion"="v4.0.30319"
"CodeBase"="file:///C:/Program Files (x86)/Informatik/Access/../NetCode/SmartCard.dll"

[HKEY_CURRENT_USER\Software\Classes\Wow6432Node\CLSID\{6Z72B1AB-31CA-4852-9552-39E149C6D6D9}\ProgId]
@="SmartCard.SmartCardValidator"

Когда я вызываю следующий код:

localesRegistryFile = @"C:\Program Files (x86)\Informatik\Access\NetCode\SmartCard.reg";
Process regeditProcess = Process.Start("regedit.exe", "/s \"" + localesRegistryFile + "\"");
regeditProcess.WaitForExit();

ключи могут быть созданы. Но, к сожалению, только ключи в

[HKEY_CURRENT_USER\Software\Classes\Wow6432Node\CLSID\{6Z72B1AB-31CA-4852-9552-39E149C6D6D9}]

созданы. Заполнение раздела

[HKEY_CURRENT_USER\Software\Classes\CLSID\{6Z72B1AB-31CA-4852-9552-39E149C6D6D9}]

не создано. Но когда я дважды щелкаю «C: \ Program Files (x86) \ Informatik \ Access \ NetCode \ SmartCard.reg» в проводнике, оба раздела импортируются.

Я уже пытался:

  • вызов кода из версии выпуска без участия отладчика.
  • вызов regedit без тега / s => без изменений, кроме вопроса безопасности перед импортом
  • используйте cmd дляcall regedit.exe / s "C: \ Program Files (x86) \ Informatik \ Access \ NetCode \ SmartCard.reg" => работает как двойной щелчок в проводнике

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

Редактировать: После ответа я изменил свой код на это:

var commandLine = "/s \"" + localesRegistryFile + "\"";

var regeditFileName = "";
if (Environment.Is64BitOperatingSystem && !Environment.Is64BitProcess)
{
    regeditFileName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows), "regedit.exe");
}
else
{
    regeditFileName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.SystemX86), "regedit.exe");
}
MessageBox.Show(regeditFileName + " 64Os: " + Environment.Is64BitOperatingSystem.ToString() + " 64BitProzess: " + Environment.Is64BitProcess.ToString());
Process regeditProcess = Process.Start(regeditFileName, commandLine);
regeditProcess.WaitForExit();

Это работает на моем компьютере, но не на2 других компьютера. Вывод во всех случаях идентичен:

C:\WINDOWS\regedit.exe 64Os: True 64BitProzess: False

Кажется, Visual Studio 2015 или 2017 как-то связаны с проблемой. Я попробовал это на другом компьютере, где установлен VS и там обе записи вставлены.

1 Ответ

1 голос
/ 31 октября 2019

Ваша проблема в том, что вы запускаете regedit.exe из 32-разрядного приложения в 64-разрядной системе. Исполняемый файл regedit.exe, расположенный в C:\Windows\SysWOW64, является 32-разрядной версией, а исполняемый файл в C:\Windows - 64-разрядной версией.

Итак, для просмотра или редактирования 64-разрядных ключей необходимо использовать 64-разрядные ключи. версия regedit.exe. Вот почему ваши ключи реестра вставляются правильно, когда вы дважды щелкаете по reg-файлу (explorer.exe - 64-битная программа в вашей системе).

Используйте этот код для определения правильной версии regedit.

var dir = "";
if(Environment.Is64BitOperatingSystem && !Environment.Is64BitProcess)
    dir = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows), "regedit.exe");        
else
    dir = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.SystemX86), "regedit.exe");

Имейте в виду, что ваше приложение запуска должно иметь права администратора для записи в реестр. Добавьте этот код в файл манифеста приложения.

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