使用c#枚举远程系统上的Windows用户组成员

2023-11-27

在 c# 中,我需要能够

  • 连接到远程系统,根据需要指定用户名/密码
  • 列出该系统上本地组的成员
  • 将结果取回执行计算机

例如,我将使用适当的凭据连接到 \SOMESYSTEM,并取回本地管理员列表,包括 SOMESYSTEM\Administrator、SOMESYSTEM\Bob、DOMAIN\AlanH、“DOMAIN\Domain Administrators”。

我已经尝试使用 system.directoryservices.accountmanagement 但遇到身份验证问题。有时我会得到:

不允许同一用户使用多个用户名多次连接到服务器或共享资源。断开之前与服务器或共享资源的所有连接,然后重试。 (HRESULT 异常:0x800704C3)

以上是尝试,因为在某些情况下我根本无法取消映射现有驱动器或 UNC 连接。

其他时候,我的程序遇到未知错误,并且远程系统上的安全日志报告错误 675,代码 0x19,即 KDC_ERR_PREAUTH_REQUIRED。

我需要一种更简单且不易出错的方法来做到这一点!


大卫走在正确的道路上,我相信他的答案。

但所需的 WMI 查询有点不那么简单,因为我不仅需要整个计算机的用户列表,还需要用户的子集和团体,无论是本地还是域,都是本地管理员组的成员。根据记录,该 WMI 查询是:

SELECT PartComponent FROM Win32_GroupUser WHERE GroupComponent = "Win32_Group.Domain='thehostname',Name='thegroupname'"

这是完整的代码片段:

public string GroupMembers(string targethost, string groupname, string targetusername, string targetpassword)
        {
            StringBuilder result = new StringBuilder(); 
            try
            {
                ConnectionOptions Conn = new ConnectionOptions();
                if (targethost != Environment.MachineName) //WMI errors if creds given for localhost
                {
                    Conn.Username = targetusername; //can be null
                    Conn.Password = targetpassword; //can be null
                }
                Conn.Timeout = TimeSpan.FromSeconds(2);
                ManagementScope scope = new ManagementScope("\\\\" + targethost + "\\root\\cimv2", Conn);
                scope.Connect();
                StringBuilder qs = new StringBuilder();
                qs.Append("SELECT PartComponent FROM Win32_GroupUser WHERE GroupComponent = \"Win32_Group.Domain='");
                qs.Append(targethost);
                qs.Append("',Name='");
                qs.Append(groupname);
                qs.AppendLine("'\"");
                ObjectQuery query = new ObjectQuery(qs.ToString());
                ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
                ManagementObjectCollection queryCollection = searcher.Get();
                foreach (ManagementObject m in queryCollection)
                {
                    ManagementPath path = new ManagementPath(m["PartComponent"].ToString());                                        
                    { 
                        String[] names = path.RelativePath.Split(',');
                        result.Append(names[0].Substring(names[0].IndexOf("=") + 1).Replace("\"", " ").Trim() + "\\"); 
                        result.AppendLine(names[1].Substring(names[1].IndexOf("=") + 1).Replace("\"", " ").Trim());                    
                    }
                }
                return result.ToString();
            }
            catch (Exception e)
            {
                Console.WriteLine("Error. Message: " + e.Message);
                return "fail";
            }
        }

因此,如果我调用 Groupmembers("Server1", "Administrators", "myusername", "mypassword");我得到一个返回的字符串:

服务器1\管理员
MYDOMAIN\域管理员

实际的 WMI 返回更像是这样:

\\SERVER1\root\cimv2:Win32_UserAccount.Domain=“SERVER1”,名称=“管理员”

...如您所见,我必须进行一些字符串操作来美化它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用c#枚举远程系统上的Windows用户组成员 的相关文章

随机推荐

  • 为什么我可以匿名子类化枚举而不是最终类?

    这段代码 public class Sandbox public enum E VALUE Override public String toString return I m the value Override public Strin
  • jQuery 动画透明

    block li hover function this animate backgroundColor 000 function this animate backgroundColor fff 需要改变 fff到没有颜色 动画应该发生于
  • 使用 Typescript 时,es6 Map() 不会编译为 es5

    我刚刚开始第一次在项目中使用 Typescript 我真的很想使用 Map 来组织一小组键值对 不幸的是 当打字稿被编译 使用 gulp 和 gulp typescript 为普通 ES5 JavaScript 时 Map 仍然存在 我需要
  • 在 ASP.NET 中,获取请求的基本 URl 的最快方法是什么?

    在 ASP NET 中是否有快速获取方案 主机 端口 仅当不是 80 时 和应用程序路径的方法 据我所知 我需要组装以下部分 请求 Url 方案 Request Url SchemeDelimiter Request Url Authori
  • Rails 模型调用控制器操作

    我需要从模型内部的方法调用控制器内部的操作 这是我在其他语言中经常做的事情 当使用 MVC 框架时 但是 我从未见过在 ruby on Rails 中这样做 该操作不会渲染任何内容 它只是更新会话变量 这实际上并不是您在 MVC 模式中通常
  • 检测 iOS8 中 UITextField 中的退格键

    为了检测退格键 我已经覆盖了DeleteBackward方法 适用于iOS5 var input new BackspaceTextField RectangleF Empty etc input BecomeFirstResponder
  • 只有一个锁定对象的“死锁”?

    我在 C 中遇到多线程问题 我使用一个事件从另一个线程更新表单中的标签 当然 我需要使用 Invoke 命令 该部分也工作正常 但是 用户可以关闭表单 如果在不合适的时间发送事件 程序可能会崩溃 因此 我想我只需重写表单的 Dispose
  • 将 SWF 加载到 WebView 中

    我遇到了这个问题 如果我直接在浏览器中访问 SWF 则效果很好 如果我尝试在 SWF 文件上使用 loadUrl 它会保持空白并且不加载任何内容 弄清楚了 您必须启用插件 webview getSettings setPluginsEnab
  • 您将如何实施越位规则?

    我已经编写了一个可以实现这一目的的生成器 但我想知道实现越位规则的最佳方法 不久 越位规则意味着在这种情况下 缩进被认为是一个语法元素 这是伪代码中的越位规则 用于制作以可用形式捕获缩进的分词器 我不想按语言限制答案 token NEWLI
  • 从 EC2 实例内调用 Spark-EC2:与主机的 ssh 连接被拒绝

    为了运行 Amplab 的训练练习 我创建了一个密钥对us east 1 已经安装了训练脚本 git clone git github com amplab training scripts git b ampcamp4 并创建了环境 变量
  • 窗口底部的 div 和自适应高度 div

    有没有办法让一个 div 始终位于窗口的底部 另一个 div 改变其高度以填充它留下的任何空间 并且如果该 div 的内容太长 它就会滚动 我从不希望窗口滚动 用一张图片最好地说明这一点 div 布局 http img401 imagesh
  • CSS 圆圈没有宽度或高度? : 这可以用纯 CSS 实现吗?

    我可以将 div 变成一个圆圈 如下所示 circle background color rgba 0 0139 0139 0 5 height 200px width 200px moz border radius 50 webkit b
  • 表格上的 Flexbox 在 Firefox 中不起作用

    使用 flexbox 控制表格的布局在 webkit 浏览器中有效 但在 Firefox 中 td s 仅渲染与其自身内容一样宽的内容 示范 http codepen io afraser pen wMgbzr editors 010 bo
  • 原始布尔值到字符串连接/转换

    这是如何运作的 我似乎找不到答案 boolean bool true System out println the value of bool is true or System out println the value of bool
  • 解决使用ajax发送阿拉伯字符的问题

    我使用 AJAX 表单将数据发送到另一个名为 show php 的页面 以下是页面来源 表单 html div div
  • 如何更新流程中的类成员? [复制]

    这个问题在这里已经有答案了 我寻找过其他问题 并且这个未接受回答的问题是我能找到的唯一一个以某种方式涵盖这个问题并且没有真正帮助的人 另外 我需要它来处理进程 而不是线程 因此 我从头开始编写了一个示例程序来展示我的问题 您应该能够粘贴它并
  • Xamarin 应用程序在设备上启动时崩溃,但在模拟器中运行良好

    如果有任何建议 请在 OS 10 8 上使用 SDK6 1 和 Xcode 5 不胜感激 应用程序在启动后立即崩溃 并且根本无法进入调试器 TestFlight 发布版本也会发生这种情况 在另一台电脑上尝试过 结果相同 甚至尝试创建一个新的
  • 带有两种不同颜色文本的 UILabel

    我想在 a 中显示这样的字符串UILabel 有 5 个结果 其中数字 5 为红色 其余字符串为黑色 我怎样才能在代码中做到这一点 这样做的方法是使用NSAttributedString像这样 NSMutableAttributedStri
  • Python Beautiful Soup 如何将 JSON 解码为“dict”?

    我是 Python 中 BeautifulSoup 的新手 我正在尝试提取dict来自美丽汤 我使用 BeautifulSoup 提取 JSON 并得到beautifulsoup beautifulsoup多变的soup 我试图从中获取价值
  • 使用c#枚举远程系统上的Windows用户组成员

    在 c 中 我需要能够 连接到远程系统 根据需要指定用户名 密码 列出该系统上本地组的成员 将结果取回执行计算机 例如 我将使用适当的凭据连接到 SOMESYSTEM 并取回本地管理员列表 包括 SOMESYSTEM Administrat