命令在控制台中工作,而不是在代码中

时间:2014-10-18 07:09:13

标签: c# process

刚刚杀了5个小时,放弃了。

此命令在非提升的命令提示符下正常工作(对密钥预先授予权限,因此没有问题):

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个开发人员感到困惑,命令不起作用,没有人能弄明白为什么。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

您的命令格式正确,并且它不是转义码问题。

可能您正在遇到UAC /特权问题。

如果您真的想沿着这条路走下去而不是使用.NET注册表API,我建议您尝试创建ProcessStartInfo的明确形式,并使用Verb" runas"得到提升的私人。

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

确定的方法是重定向IO并查看进程/ shell所说的内容。

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

var child = Process.Start(processStartInfo);

您需要从stderr / stdout读取(启动一个线程,或者只是为了这个案例同步执行)

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());

答案 1 :(得分:0)

尝试使用Registry类。即使您 - 无论出于何种原因 - 必须使用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);