查询活动用户名时出现 c# RPC 服务器错误

c# RPC server error when query for active username

我有一个使用 WMI 连接到远程计算机的功能。当我以管理员权限启动它时,系统显示 RPC 服务器错误。

我在 Powershell 中有相同类型的脚本,它工作正常,没有 RPC 服务器错误(所以 WMI 在网络上工作,防火墙没有阻止它。我只在互联网上找到那种答案) , 以及公司其他用c#写的软件在那些电脑上都可以正常工作(开发人员已经不在公司工作了,我也拿不到源码)

无论我使用计算机的名称还是它的 IP 地址,都会出现同样的问题。

static public string GetUsername(string computer)
    {

        string username = string.Empty;
        ManagementScope scope = new ManagementScope("\\computer\root\cimv2");
        //scope.Connect(); If I activate this line, the error occurs on this line
        string queryString = "select LogonId from win32_logonsession where logontype = 2";
        ManagementObjectSearcher query = new ManagementObjectSearcher(scope, new SelectQuery(queryString));
        foreach (ManagementObject mo in query.Get()) //if scope.connect(); is not activated, it's blocking on this line
        {
            username = mo["LogonId"].ToString();

        }



        return username;
    }

我尝试从 Visual Studio 或直接从 .exe(使用管理员)运行 我的软件。我还尝试以编程方式模拟工作站管理员,但问题仍然存在。

提前感谢您的帮助。

编辑

我已经尝试过像这样使用 connectionOptions 的解决方案:

options.Username = "YOUR USERNAME";
options.Password = "YOUR PASSWORD";
options.Authority = "ntlmdomain:YOURDOMAIN";

像这样:

options.Username = "YOUR USERNAME";
options.Password = "YOUR PASSWORD";
options.Authority = "Kerberos:YOURDOMAIN";

并添加了模拟选项

   options.Impersonation = ImpersonationLevel.Impersonate;
   options.EnablePrivileges = true;

还是不行。

您试过像这样为管理范围设置用户名和密码吗?

static public string GetUsername(string computer)
{
    string username = string.Empty;
    ConnectionOptions options = new ConnectionOptions();
    options.Username = "YOUR USERNAME";
    options.Password = "YOUR PASSWORD";
    options.Authority = "ntlmdomain:YOURDOMAIN";
    ManagementScope scope = new ManagementScope("\\computer\root\cimv2",options);
    //scope.Connect(); If I activate this line, the error occurs on this line
    string queryString = "select LogonId from win32_logonsession where logontype = 2";
    ManagementObjectSearcher query = new ManagementObjectSearcher(scope, new SelectQuery(queryString));
    foreach (ManagementObject mo in query.Get()) //if scope.connect(); is not activated, it's blocking on this line
    {
        username = mo["LogonId"].ToString();
    }
    return username;
}

有关详细信息,请查看 ManagementScope here 的 MSDN 页面 对于 ConnectionOptions here.

好的,我明白了...我的错误在行

ManagementScope scope = new ManagementScope("\\computer\root\cimv2",options);

应该是

ManagementScope scope = new ManagementScope("\\" + computer + "\root\cimv2",options); 

变量 computer 在字符串中无法识别,就像在 Powershell 中一样...我的错!

感谢所有试图提供帮助的人...下次我会更加小心!