1

我尝试显示特殊用户所在的所有组。我也知道,我可以这样做:

 public static List<Principal> getUsers(){
     PrincipalContext context = new PrincipalContext(ContextType.Machine, "computername");
        PrincipalSearcher search = new PrincipalSearcher(new UserPrincipal(context));
        return search.FindAll().ToList();

    }

但是我想在 PrincipalContext 附近工作,因为我需要在 PC 上远程使用它,而这不在域中。所以我尝试了这个:

 public static void findUsers()
    {
        ObjectQuery query = new ObjectQuery("SELECT * FROM Win32_Group WHERE LocalAccount.Name =\'Test'");
        ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
        var result = searcher.Get();
         foreach (var envVar in result)
        {
            Console.WriteLine("GroupName: {0}", envVar["Name"]);
        }
        Console.ReadLine();
    }

它给了我一个例外,因为查询不正确。

非常感谢任何形式的帮助。

4

2 回答 2

1

@Edper 您的提示非常好,但我使用了另一种方法来解决我的问题。

任务是只需输入远程服务器的用户名和 IP,然后您就可以获取该本地用户所在的所有组。

class Program
{
    static ManagementScope scope =
           new ManagementScope(
               "\\\\ServerIP\\root\\cimv2");
    static string username = "Test";


    static void Main(string[] args)
    {
        string partComponent = "Win32_UserAccount.Domain='Domain',Name='"+username+"'";
        ObjectQuery query = new ObjectQuery("SELECT * FROM Win32_GroupUser WHERE PartComponent = \"" + partComponent + "\"");
        using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query))
        {
            var result = searcher.Get();
            foreach (var envVar in result)
            {
                ManagementObject groupComponent = new ManagementObject("\\\\ServerIP\\root\\cimv2", envVar["GroupComponent"].ToString(), null);
                Console.WriteLine(groupComponent["Name"]);
            }
        }
        Console.ReadLine(); 
    }
}

当然,这还没有完成 jet(GUI 正在进行中),但它现在可以满足我的所有需求。

如果你想测试它,你需要在远程PC上创建一个本地用户,该用户具有与运行代码的用户相同的用户名和密码。(并且该用户需要管理员权限)

于 2014-07-24T06:50:08.897 回答
0

没有LocalAccount.Name字段,而是简单地使用Name并删除\,所以它看起来像:(我使用 'Guests' 作为我的示例而不是 'Test'

public static void findUsers()
{
    ObjectQuery query = new ObjectQuery("SELECT * FROM Win32_Group WHERE Name = 'Guests'");
    ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
    var result = searcher.Get();
     foreach (var envVar in result)
    {
        Console.WriteLine("GroupName: {0}", envVar["Name"]);
    }
    Console.ReadLine();
}
于 2014-07-23T12:04:45.790 回答