.Net GetProcesses 的访问被拒绝

Posted

技术标签:

【中文标题】.Net GetProcesses 的访问被拒绝【英文标题】:Access denied for .Net GetProcesses 【发布时间】:2016-04-27 22:59:24 【问题描述】:

我无法连接到远程计算机以获取正在运行的进程列表。 对于我的测试机器,我使用用户名@"ownme\veritas"。密码只是“veritas”。 示例域是“ownme”。

return new System.Management.ConnectionOptions()

    //certainly these variables have been checked and are correct
    Username = UserCredential.DomainUser,
    Password = UserCredential.Password
;

这是我尝试建立连接的地方。我不知道,但这实际上可能是这里的问题。也可能是我没有在上面的 ConnectionOptions 中填写足够的字段。 我参考了这两篇文章:

https://www.experts-exchange.com/questions/23514935/How-to-use-GetProcess-for-remote-sytems.html

https://msdn.microsoft.com/en-us/library/system.management.connectionoptions.authentication.aspx

我不知道我做错了什么

ManagementScope scope = new ManagementScope($"\\\\computer.DnsHostname\\root\\cimv2", connectionOptions);
scope.Connect();

//Error: Access is denied
var processes = System.Diagnostics.Process.GetProcesses(dnsHostName);

【问题讨论】:

【参考方案1】:

GetProcesses 将使用当前用户凭据连接到远程计算机,而不是您通过 ConnectionOptions 指定的凭据。

您需要使用您创建的具有正确凭据的 WMI 范围对象来为进程发出查询,如下所示:

//..

SelectQuery query = new SelectQuery("select * from Win32_Process"); //query processes

using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query))

    using (ManagementObjectCollection collection = searcher.Get())
    
        foreach (var process in collection) //loop through results
        
            var name = process["name"]; //process name
            //Do something with process
        
    

【讨论】:

【参考方案2】:

我没有意识到这是一个备受关注的问题:我很久以前就找到了答案。我实际上并没有使用 WMI 来做到这一点。我们实际上向微软提交了一张票,并在他们给我们答案后免费给我们打折。答案是:

LogonUser + NEW_CREDENTIALS

【讨论】:

以上是关于.Net GetProcesses 的访问被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

如何修复访问被拒绝路径错误asp.net应用程序访问网络共享

ASP.NET 和 ActiveDirectory 常规访问被拒绝错误

“访问路径......被拒绝”(.NET C#)

Process.StartTime访问被拒绝(.Net Core)

电脑C盘中,我删除程序时,出现无法删除,访问被拒绝现象,问,如何解决?

403 - 禁止:访问被拒绝。 ASP.Net MVC [重复]