я пытаюсь отобразить все группы, в которых находится специальный пользователь. Я также знаю, что могу сделать это следующим образом:
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();
}
Это дает мне исключение, потому что запрос не правильный.
Большое спасибо за любую помощь.
@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 в прогресс), но он делает все, что я хочу сейчас.
если вы хотите протестировать его, вам нужно сделать локального пользователя на удаленном ПК, у которого есть то же имя пользователя и пароль, что и пользователь, который запускает код с. (и этому пользователю нужны права администратора)
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();
}
System.Data.Entity
для справки и System.Data.Objects
для пространства имен.