2014-10-18 3 views
1

Только что убил 5 часов, отказавшись от этого момента.Команда работает в консоли, а не в коде

Эта команда отлично из командной строки без повышенных работ (разрешения pregranted на ключе, так что никаких вопросов):

REG ADD "HKCR\CLSID\{323CA680-C24D-4099-B94D-446DD2D7249E}\ShellFolder" /v Attributes /d 0xA0900100 /t REG_DWORD /f 

Но C# версии не производит никаких изменений в RegKey: (та же машина как указано выше, с разрешениями же RegKey упаковывают кто спрашивает):

System.Diagnostics.Process.Start("CMD", "/C REG ADD \"HKCR\\CLSID\\{323CA680-C24D-4099-B94D-446DD2D7249E}\\ShellFolder\" /v Attributes /d 0xA0900100 /t REG_DWORD /f"); 

Я пробовал несколько вариантов, ни один из них не работает. 3 других разработчика, с которыми я имею дело, сбиты с толку, команда не работает, и никто не может понять, почему. Есть идеи?

+1

Вы пытались захватить стандартные выходные и стандартные потоки ошибок, чтобы увидеть, записаны ли какие-либо ошибки командой 'reg'? – cdhowie

+2

В чем причина использования процесса запуска вместо использования класса .NET Registry? – Postlagerkarte

+0

Почему у вас есть программа, вызывающая CMD? «REG» - это только% SystemRoot% \ System32 \ reg.exe; он находится в PATH, поэтому вы можете вызывать его прямо из вашего кода на C#. Таким образом, вам не нужно беспокоиться о передаче сложного параметра через параметр CMD/C. (Угадайте, ваша проблема - это один из вариантов экранирования в CMD.) – CBHacking

ответ

0

Ваша команда хорошо сформирована, и это не проблема с кодом выхода.

Вероятно, вы столкнулись с проблемой UAC/привилегий.

Если вы действительно хотите пойти по этому пути, а не с помощью .NET-реестра, я рекомендую вам попробовать явную форму создания ProcessStartInfo и использовать глагол «runas» для получения привилегированных привилегий.

processStartInfo.UseShellExecute = true; 
processStartInfo.Verb = "runas"; 

Верный способ узнать, перенаправить IO и посмотреть, что говорит процесс/оболочка.

processStartInfo.RedirectStandardInput = true; 
processStartInfo.RedirectStandardOutput = true; 
processStartInfo.RedirectStandardError = true; 

var child = Process.Start(processStartInfo); 

Вы должны будете читать Stderr/стандартный вывод (начать нить, или просто для этого случая делать это синхронно)

var sb = new StringBuilder(); 
while ((nRead = child.StandardError.Read(buffer, 0, BUFSIZE)) > 0) 
    for (int n = 0; n < nRead; n++) 
     sb.Append(buffer[n]); 

Console.WriteLine(sb.ToString()); 
+0

Вау, это решение фактически устранило аналогичные проблемы в паре других программ. имея способ выбросить выходной буфер в переменную, упрощает процесс peasy. Спасибо :) – user3766550

+0

Да. На самом деле у меня есть класс многократного использования, а также компонент winforms для регистрации перенаправленного ввода-вывода в окне или для переноса произвольной консольной программы. Это, безусловно, полезно. – codenheim

0

Попробуйте использовать класс реестра. Даже если вы - по какой-либо причине - должны использовать Process.Start, это поможет вам отладить вашу проблему.

string key = @"HKCR\CLSID\{323CA680-C24D-4099-B94D-446DD2D7249E}\ShellFolder"; 
string valueName = "Attributes"; 
string value ="0xA0900100"; 

Microsoft.Win32.Registry.SetValue(key, valueName, value, Microsoft.Win32.RegistryValueKind.String); 
Смежные вопросы