Мне нужно экспортировать ключ реестра из куста HKLM в файл.Это ключ, который я успешно создал всего несколько строк назад в той же программе.Я использую объект Process, чтобы моя программа на C # выполнила команду оболочки:
cmd.exe / c regedit.exe / e C: \ temp \ CDPRegExport.txt HKEY_LOCAL_MACHINE \ SOFTWARE \ NPTMigration
Если я выполняю свою программу, файл C: \ temp \ CDPRegExport.txt не создается.Однако, если я запускаю указанную выше команду напрямую (в этом же окне административной консоли), она работает нормально!
Я попытался добавить манифест приложения, чтобы убедиться, что моя программа .NET работает от имени администратора.
Я попытался вызвать экспорт reg.exe вместо regedit.exe / e, но в результате получилсято же самое (я предполагаю, что одна и та же DLL в конечном итоге используется этими двумя программами).
Вот основной метод экспорта реестра:
static bool RegistryExport(string regKey, string destFile)
{
Cmd cmd = new Cmd()
{
CreateNoWindow = true
};
cmd.Exec(@"regedit.exe", @"/e", destFile, regKey);
Console.WriteLine("Standard Out:\r\n" + cmd.StandardOut);
Console.WriteLine("Standard Error:\r\n" + cmd.StandardErr);
if (!File.Exists(destFile))
{
AppContext.log.Critical(@"Registry export file ({0}) not found!", destFile);
return false;
}
return true;
}
... А вот Cmd.Exe ():
public void Exec(string command, params string[] Parameters)
{
string fullyQualifiedCommand = @"/c " + command + GetParameters(Parameters);
Console.WriteLine(fullyQualifiedCommand);
try
{
psi = new ProcessStartInfo(@"cmd", fullyQualifiedCommand)
{
RedirectStandardOutput = true,
RedirectStandardError = true,
};
psi.UseShellExecute = false;
psi.CreateNoWindow = true;
using (Process process = new Process())
{
process.StartInfo = psi;
process.Start();
if (RedirectIOStreams)
{
StandardOut = process.StandardOutput.ReadToEnd();
StandardErr = process.StandardError.ReadToEnd();
}
process.WaitForExit();
}
NormalExit = true;
}
catch (Exception ex)
{
StandardOut = string.Empty;
StandardErr = ex.ToString();
}
}
private static string GetParameters(string[] Parameters)
{
string expression = string.Empty;
if (Parameters.Length == 0)
return string.Empty;
for (int index=0; index<Parameters.Length; index++)
{
if (Parameters[index].Contains(" "))
expression += " \"" + Parameters[index] + "\"";
else
expression += " " + Parameters[index];
}
return expression;
}
Когда программа использует regedit.exe, стандартная ошибка и стандартная ошибка просто пусты.
Когда используется reg.exe экспорт, однако, стандартныйошибка показывает: «ОШИБКА: системе не удалось найти указанный ключ или значение реестра.»
Опять же, это странно, потому что, если я вызываю точно такой же reg.exe или regedit.Синтаксис exe напрямую через командное окно, он отлично работает!