我發現我可以像CraigTP所示使用OpenRemoteBaseKey()方法,但它需要我更改目標計算機上註冊表中的權限。
這是我寫的代碼,一旦我改變了權限就工作了。
RegistryKey rkey = RegistryKey.OpenRemoteBaseKey(RegistryHive.LocalMachine, "RemoteComputer");
RegistryKey rkeySoftware = rkey.OpenSubKey("Software");
RegistryKey rkeyVendor = rkeySoftware.OpenSubKey("VendorName");
RegistryKey rkeyVersions = rkeyVendor.OpenSubKey("Versions");
String[] ValueNames = rkeyVersions.GetValueNames();
foreach (string name in ValueNames)
{
MessageBox.Show(name + ": " + rkeyVersions.GetValue(name).ToString());
}
我還發現我可以使用WMI獲得相同的信息而無需修改權限。這是WMI的代碼。
ManagementScope ms = new ManagementScope();
ms.Path.Server = "flebbe";
ms.Path.NamespacePath = "root\\default";
ms.Options.EnablePrivileges = true;
ms.Connect();
ManagementClass mc = new ManagementClass("stdRegProv");
mc.Scope = ms;
ManagementBaseObject mbo;
mbo = mc.GetMethodParameters("EnumValues");
mbo.SetPropertyValue("sSubKeyName", "SOFTWARE\\VendorName\\Versions");
string[] subkeys = (string[])mc.InvokeMethod("EnumValues", mbo, null).Properties["sNames"].Value;
ManagementBaseObject mboS;
string keyValue;
foreach (string strKey in subkeys)
{
mboS = mc.GetMethodParameters("GetStringValue");
mboS.SetPropertyValue("sSubKeyName", "SOFTWARE\\VendorName\\Versions");
mboS.SetPropertyValue("sValueName", strKey);
keyValue = mc.InvokeMethod("GetStringValue", mboS, null).Properties["sValue"].Value.ToString();
MessageBox.Show(strKey + " : " + keyValue);
}
P.S. 我正在調用循環中的GetStringValue()方法,因爲我知道所有的值都是字符串。如果有多種數據類型,則需要從EnumValues方法的Types輸出參數中讀取數據類型。
你考慮過WMI嗎? – 2009-10-14 14:20:47