Как я могу получить все группы локального пользователя, используя ObjectQuery?

1

я пытаюсь отобразить все группы, в которых находится специальный пользователь. Я также знаю, что могу сделать это следующим образом:

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

    }

Но я хочу работать с arount PrincipalContext, потому что мне нужно использовать его удаленно на ПК, который не имеет домена. Поэтому я попробовал это:

 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();
    }

Это дает мне исключение, потому что запрос не правильный.

Большое спасибо за любую помощь.

  • 0
    Попробуйте удалить `\` в вашем запросе.
  • 0
    Эй, спасибо за этот совет, но я попробовал несколько видов форматов. Не работает для меня
Теги:
usergroups
principalcontext

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 в прогресс), но он делает все, что я хочу сейчас.

если вы хотите протестировать его, вам нужно сделать локального пользователя на удаленном ПК, у которого есть то же имя пользователя и пароль, что и пользователь, который запускает код с. (и этому пользователю нужны права администратора)

  • 0
    Нет проблем @Jirayia. Хорошо, что у тебя это работает. Продолжайте кодировать и БОГ благословит.
0

LocalAccount.Name этого нет поля LocalAccount.Name просто используйте просто Name и удалите также \, чтобы он выглядел следующим образом: (Я использовал "Гости" в качестве моего примера, а не "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();
}
  • 0
    Эй, спасибо за твой ответ. Нужно ли добавлять какие-либо ссылки для этого? Я спрашиваю, потому что мой запрос не имеет метода Where ().
  • 0
    System.Data.Entity для справки и System.Data.Objects для пространства имен.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню