Это должно быть легко сделать использование WMI. Здесь у Вас есть указатель на некоторые документы:
Документация WMI для Win32_UserAccount
Даже если у Вас нет предыдущего опыта с WMI, должно быть довольно легко повернуть это код Сценария VB внизу страницы в некоторый код.NET.
Надеюсь, что это помогло!
davidg был на правильном пути, и я приписываю ему ответ.
Но WMI запрашивает необходимый, был немного меньше, чем straightfoward, так как мне был нужен не только список пользователей для целой машины, но подмножество пользователей и групп, или локальный или доменный, которые были членами группы локальных администраторов. Для записи, которой был запрос 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"); я возвратил единственную строку с:
SERVER1\Administrator
Администраторы MYDOMAIN\Domain
Фактический возврат WMI больше похож на это:
\\SERVER1\root\cimv2:Win32_UserAccount. Домен = "SERVER1", Имя = "Администратор"
... таким образом, как Вы видите, я должен был сделать немного обработки строк к симпатичному это.
Я рекомендовал бы использовать API-функцию Win32 NetLocalGroupGetMembers. Это является намного более прямым, чем попытка выяснить сумасшедший синтаксис LDAP, который необходим для некоторых из других решений, рекомендуемых здесь. Пока Вы исполняете роль пользователя, которого Вы хотите осуществить проверку как путем вызова "LoginUser", Вы не должны сталкиваться ни с какими проблемами безопасности.
Можно найти пример кода для того, чтобы сделать олицетворение здесь.
Если Вы нуждаетесь в помощи, выясняя, как назвать "NetLocalGroupGetMembers" от C#, я reccomend, что Вы контроль помощник Jared Parson PInvoke, который можно загрузить с codeplex.
Если Вы выполняете код в приложении ASP.NET, работающем в IIS, и хотите исполнить роль пользователя, получающего доступ к веб-сайту для совершения вызова, то Вы, возможно, должны предоставить "Доверяемый для Делегации" разрешение к производственному веб-серверу.
Если Вы работаете на рабочем столе, то использование учетных данных безопасности активного пользователя не должно быть проблемой.
Возможно, что Вы объединяетесь в сеть, администратор, возможно, отклонил доступ к "Объекту Securable" для конкретной машины, к которой Вы пытаетесь получить доступ. К сожалению, тот доступ необходим для всех функций API управления сетью для работы. Если это так, затем необходимо будет предоставить доступ к "Объекту Securable" для любых пользователей, которых Вы хотите выполнить как. С настройками безопасности Windows по умолчанию у всех аутентифицируемых пользователей должен быть доступ, как бы то ни было.
Я надеюсь, что это помогает.
- Scott
Необходимо смочь сделать это с Системой. DirectoryServices. DirectoryEntry. При наличии затруднений при выполнении его удаленно возможно, Вы могли бы установить что-то на удаленных машинах, чтобы дать Вам Ваши данные через своего рода RPC, как дистанционная работа или веб-сервис. Но я думаю, что Вы пробуете, должно быть возможным удаленно, не становясь слишком необычным.
Если Windows не позволит Вам соединиться через, это - механизм входа в систему, я думаю, что Ваша единственная опция состоит в том, чтобы выполнить что-то на удаленной машине с открытым портом (или непосредственно или через дистанционную работу или веб-сервис, как упомянуто).