簡體   English   中英

WMI:遠程編輯注冊表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM