我正在尝试使用以下代码(写得很糟糕,但仅是概念验证)来编辑域上计算机的注册表。我有一个域帐户,并已验证域管理员组存在于我正在尝试影响的计算机的本地管理员组中。我已连接到这些其他计算机以执行其他管理类型任务,因此我确定我在这些主机上拥有管理权限。
所有StdRegProv的“获取”方法都正常工作(http://msdn.microsoft.com/en-us/library/aa393664%28VS.85%29.aspx),但“设置”或“创建”方法以及检查访问权限都返回“5”,这是根据winerror.h的“Error_Access_Denied”。所以问题就在这里:为什么我在尝试修改注册表时会被拒绝访问?如果有人能帮助我解决这个问题,我将非常感激!
我差点忘了,在我的本地计算机上以管理员模式启动Visual Studio并对本地计算机运行代码时,它可以无缝运行。如果我不在本地计算机上以管理员模式启动,则代码会失败,因此我怀疑这可能是UAC问题?更新:使用regedit连接到远程计算机,我可以更改注册表键,这使我相信这不是UAC问题,但在我的机器上以提升的模式运行时,它使用本地WMI连接执行,所以也许它是UAC问题。另外,winXP机器返回相同的错误码(5,ERROR_ACCESS_DENIED),这使我相信这不是UAC问题...这很糟糕。解决方案:ManagementClass对象正在使用错误的重载;它必须使用ManagementScope进行参数化,否则,您只是在本地执行函数。
所有StdRegProv的“获取”方法都正常工作(http://msdn.microsoft.com/en-us/library/aa393664%28VS.85%29.aspx),但“设置”或“创建”方法以及检查访问权限都返回“5”,这是根据winerror.h的“Error_Access_Denied”。所以问题就在这里:为什么我在尝试修改注册表时会被拒绝访问?如果有人能帮助我解决这个问题,我将非常感激!
我差点忘了,在我的本地计算机上以管理员模式启动Visual Studio并对本地计算机运行代码时,它可以无缝运行。如果我不在本地计算机上以管理员模式启动,则代码会失败,因此我怀疑这可能是UAC问题?更新:使用regedit连接到远程计算机,我可以更改注册表键,这使我相信这不是UAC问题,但在我的机器上以提升的模式运行时,它使用本地WMI连接执行,所以也许它是UAC问题。另外,winXP机器返回相同的错误码(5,ERROR_ACCESS_DENIED),这使我相信这不是UAC问题...这很糟糕。解决方案:ManagementClass对象正在使用错误的重载;它必须使用ManagementScope进行参数化,否则,您只是在本地执行函数。
ManagementClass mc = new ManagementClass(scope, new ManagementPath("StdRegProv"), null);
是的,我很失败 :/ 9000行代码,而这一行让我卡了最久的时间。
using System;
using System.Management;
public class EditRemoteRegistry
{
public static void Main(string[] args)
{
ConnectionOptions options = new ConnectionOptions();
options.EnablePrivileges = true;
options.Impersonation = ImpersonationLevel.Impersonate;
options.Password = "password goes here";
//options.Authority = "my company's domain";
//options.Username = "Admin username";
ManagementScope scope = new ManagementScope("\\\\arbitraryhost\\root\\default", options);
scope.Connect();
ManagementClass mc = new ManagementClass("StdRegProv");
ManagementBaseObject inParams = mc.GetMethodParameters("CreateKey");
inParams["hDefKey"] = (UInt32)2147483650;
inParams["sSubKeyName"] = "Software\\Test";
ManagementBaseObject outParams = mc.InvokeMethod("CreateKey", inParams, null);
//Should return a 0, but returns a 5, "Error_Access_Denied"
Console.WriteLine("CreateKey Method returned " + outParams["returnValue"]);
//This chunk works fine
ManagementBaseObject inParams5 = mc.GetMethodParameters("GetDWORDValue");
inParams5["hDefKey"] = 2147483650;
inParams5["sSubKeyName"] = "Software\\Test";
inParams5["sValueName"] = "testDWORDvalue";
ManagementBaseObject outParams5 = mc.InvokeMethod("GetDWORDValue", inParams5, null);
Console.WriteLine("GetDWORDValue returned " + (UInt32)outParams5["returnValue"] + " ");
Console.WriteLine((UInt32)outParams5["uValue"]);
ManagementBaseObject inParams6 = mc.GetMethodParameters("SetStringValue");
inParams6["hDefKey"] = 2147483650;
inParams6["sSubKeyName"] = "Software\\Test";
inParams6["sValueName"] = "TestStringValue";
inParams6["sValue"] = "Hello World!";
ManagementBaseObject outParams6 = mc.InvokeMethod("SetStringValue", inParams6, null);
//Should return a 0, but returns a 5, "Error_Access_Denied"
Console.WriteLine("SetStringValue returned " + outParams6["returnValue"]);
Console.ReadKey();
}
}
ManagementClass mc = new ManagementClass(conn, new ManagementPath("StdRegProv"), null);
- Quanta