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