[英]WMI: Editing the Registry Remotely
我正在嘗試使用以下代碼(寫得不好,但它只是一個概念證明)來編輯域上計算機的注冊表。 我有一個域帳戶,我已經驗證域管理員組在我試圖影響的計算機上的本地管理員組中。 我已連接到這些其他計算機以執行其他管理類型的任務,因此我確信我對這些主機具有管理權限。
所有StdRegProv的“獲取”方法都可以正常工作( http://msdn.microsoft.com/en-us/library/aa393664%28VS.85%29.aspx )但是“set”或“create”方法以及檢查根據winerror.h訪問所有返回“5”,即“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);
是的,我是一個史詩般的失敗:/ 9K行代碼,這條線讓我把它們放在了最長的一行。
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();
}
}
您還可以關閉遠程UAC過濾。
不建議通過更改控制遠程UAC的注冊表項來禁用遠程UAC,但在工作組中可能是必需的。 注冊表項是HKLM \\ SOFTWARE \\ Microsoft \\ Windows \\ CurrentVersion \\ Policies \\ system \\ LocalAccountTokenFilterPolicy。 當此條目的值為零(0)時,將啟用遠程UAC訪問令牌過濾。 值為1時,禁用遠程UAC。
http://msdn.microsoft.com/en-us/library/aa826699(VS.85).aspx
似乎在針對具有UAC的計算機上運行WMI setter時存在問題。
引用
根據我們從現場收到的報告,似乎需要禁用UAC才能使遠程WMI查詢正常工作。 在UAC運行時,管理員帳戶實際上有兩個安全令牌,一個普通用戶令牌和一個管理員令牌(只有在您通過UAC提示時才會激活)。 遺憾的是,通過網絡進入的遠程請求獲得管理員的正常用戶令牌,並且由於無法遠程處理UAC提示,因此無法將令牌提升為真實管理員安全令牌。
來源: http : //www.poweradmin.com/help/enableWMI.aspx
嘗試編輯遠程計算機的注冊表項:
HKLM \\ SOFTWARE \\微軟\\的Windows \\ CurrentVersion \\政策\\系統\\ LocalAccountTokenFilterPolicy。
0 - 構建過濾的令牌(啟用遠程UAC)1 - 構建提升的令牌(禁用遠程UAC)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.