Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WMI:远程编辑注册表_C#_Permissions_Registry_Wmi_Uac - Fatal编程技术网

C# WMI:远程编辑注册表

C# WMI:远程编辑注册表,c#,permissions,registry,wmi,uac,C#,Permissions,Registry,Wmi,Uac,我正试图使用以下代码(写得很糟糕,但这只是一个概念证明)来编辑域上计算机的注册表。我有一个域帐户,并且我已验证域管理员组是否存在于我试图影响的计算机上的本地管理员组中。我已连接到这些其他计算机以执行其他管理类型的任务,因此我确信我对这些主机具有管理权限 StdRegProv的所有“get”方法都可以正常工作(),但是“set”或“create”方法以及check-access都返回“5”,根据winerror.h,这是“Error\u-access\u-Denied”。所以有一个问题:为什么我在

我正试图使用以下代码(写得很糟糕,但这只是一个概念证明)来编辑域上计算机的注册表。我有一个域帐户,并且我已验证域管理员组是否存在于我试图影响的计算机上的本地管理员组中。我已连接到这些其他计算机以执行其他管理类型的任务,因此我确信我对这些主机具有管理权限

StdRegProv的所有“get”方法都可以正常工作(),但是“set”或“create”方法以及check-access都返回“5”,根据winerror.h,这是“Error\u-access\u-Denied”。所以有一个问题:为什么我在试图修改注册表时会被拒绝访问?如果有人能帮我解决这个问题,我将不胜感激

我差点忘了,当我在本地机器上以管理模式启动VisualStudio并在本地机器上运行代码时,它工作得完美无缺。如果我没有在本地机器上以管理模式启动,代码就会失败,所以我怀疑可能是UAC问题

更新:使用regedit并连接到远程计算机,我可以更改注册表项,这使我相信这不是UAC问题,但在我自己的机器上以提升模式运行时,它使用本地WMI连接执行,因此可能是UAC。此外,winXP机器返回相同的错误代码(5,错误访问被拒绝),这让我相信这不是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开启的机器上运行WMI设置程序似乎存在问题

引述

从我们从现场收到的报告来看,似乎需要禁用UAC才能使远程WMI查询正常工作。UAC运行时,管理员帐户实际上有两个安全令牌,一个普通用户令牌和一个管理员令牌(只有在通过UAC提示时才会激活)。不幸的是,通过网络传入的远程请求会为管理员获取正常的用户令牌,并且由于无法远程处理UAC提示,因此无法将令牌提升为真正的管理员安全令牌

资料来源:

尝试编辑远程计算机的注册表项:

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policys\system\LocalAccountTokenFilterPolicy

0-生成筛选令牌(启用远程UAC)
1-生成提升令牌(禁用远程UAC)

您还可以关闭远程UAC筛选

不建议通过更改控制远程UAC的注册表项来禁用远程UAC,但在工作组中可能需要这样做。注册表项为HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policys\system\LocalAccountTokenFilterPolicy。当此项的值为零(0)时,将启用远程UAC访问令牌筛选。当该值为1时,远程UAC被禁用


好提示,但不幸的是,策略要求跨域打开UAC。另外,在注册表值更改后,计算机不需要重新启动吗?是否尝试将用户添加到本地管理组?根据我发布的链接:“如果您的计算机是域的一部分,请使用远程计算机的本地管理员组中的域帐户连接到目标计算机。然后UAC访问令牌过滤将不会影响本地Administrators组中的域帐户。“我不知道在您的情况下这是否可行。不幸的是,是的,我已经尝试过了(请参阅我文章的第一段)。我认为msdn说“那么UAC访问令牌过滤将不会影响本地Administrators组中的域帐户”是不正确的,因为除非我遗漏了什么,否则它肯定会影响本地Administrators组中的域帐户。。。我希望我错过了什么。肯定有人用WMI远程编辑了注册表?明白了。。。请注意,我的ManagementClass没有使用connection对象参数化。在过去的两天里,我一直在本地执行这些函数,就像EPIC-FAIL N00b tard dumba一样**。作为解决办法,我创建了一个.reg文件,将其推送到远程计算机,运行它,在win32_进程上得到了一个错误代码8。我觉得这很奇怪,所以我决定运行记事本,并注意到它是在我面前而不是在远程机器上执行的。正确的代码类似于:ManagementClass mc=new ManagementClass(conn,new ManagementPath(“StdRegProv”),null);这就是问题所在,我无法远程编辑密钥,因为UAC已打开。我将在数千台机器上运行此代码,不幸的是,它们都需要运行UAC:/