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

本文关键字:工作 代码 命令 控制台 | 更新日期: 2023-09-27 18:27:01

刚刚为此牺牲了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名开发人员对该命令不起作用感到困惑,没有人能找出原因。有什么想法吗?

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

您的命令格式良好,并且不是转义码问题。

您可能遇到了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());

尝试使用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);