Получить всех пользователей, которые когда-либо заходили на компьютер с помощью С#

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

Я собирался посмотреть на:

DirectoryInfo(Environment.GetEnvironmentVariable("USERPROFILE")).Parent.GetDirectories();

Но я чувствую, что это путь к ненадежным.

Затем я собирался посмотреть реестр, но после прочтения этот список не будет обновляться, если имя учетной записи пользователя когда-либо было изменено. Я знаю, что должна быть запись всех профилей пользователей на машине, потому что я использовал инструменты Microsoft systernals для управления ими. но я просто не могу понять, как это сделать программно с С#.


person tomohulk    schedule 22.05.2013    source источник
comment
Чтобы уточнить, список хранится здесь: dl.dropboxusercontent.com/u/ 7248788/profiles.PNG запрос WMI, похоже, возвращает всех пользователей в моем домене, мне нужны только локальные профили, хранящиеся на ПК, но профили домена. (я вырезал профили с картинки, сейчас у меня на компе 4 профиля).   -  person tomohulk    schedule 23.05.2013


Ответы (4)


Хорошо, я понял это, на самом деле с WMI в конце концов, вот мой код.

using System.Security.Principal;
using System.Management;
private void GetLocalUserAccounts()
{
     SelectQuery query = new SelectQuery("Win32_UserProfile");
     ManagementObjectsSearcher searcher = new ManagementObjectSearcher(query);
     foreach (ManagementObject sid in searcher.Get())
     {
          MessageBox.Show(new SecurityIdentifier(sid["SID"].ToString()).Translate(typeof(NTAccount)).ToString());
     }
}

Это также возвращает системные учетные записи IE: NT_Authority NT_System, но их можно легко отфильтровать. Спасибо за помощь.

person tomohulk    schedule 23.05.2013
comment
У меня была ошибка, из-за которой невозможно было найти ManagementObjectsSearcher (даже с использованием System.Management и включением его в мои ссылки). Я исправил это, изменив: ManagementObjectsSearcher searcher = new ManagementObjectSearcher(query); TO var searcher = новый ManagementObjectSearcher(запрос); Надеюсь, это поможет, если у кого-то еще есть такая же проблема! - person Steve Byrne; 28.08.2015

Я бы посоветовал взглянуть на WMI. Это позволяет вам запускать sql-подобные запросы на машине, чтобы получить множество системной информации.

Немного вдохновения в VBScript: http://social.technet.microsoft.com/Forums/en-US/ITCG/thread/2b99b836-ed8f-4146-89e4-947b79bf4862/

person bcolin    schedule 22.05.2013

Если пользователь создается на локальном компьютере, у него должна быть папка пользователя, как сказал Джошуа.

Кроме того, вы можете попробовать запустить команду CMD «net user» и зафиксировать возвращаемое значение, используя что-то вроде это.

Изменить: в комментариях ниже проверьте это и посмотрите, поможет ли это: https://stackoverflow.com/a/8455654/1046689< /а>

person kitified    schedule 22.05.2013
comment
Я извиняюсь, я должен был быть более конкретным в своем вопросе. на самом деле меня больше интересуют профили пользователей домена. - person tomohulk; 22.05.2013
comment
Я нашел запрос WMI, похожий на этот, но я возвращаю каждого пользователя в своем домене, я хочу знать только пользователей домена, которые вошли в систему на компьютере, на котором запущено приложение. - person tomohulk; 22.05.2013
comment
Я думаю, что это будет в основном зависеть от настроек вашего домена. В моей компании, например, если пользователь входит в систему, используя учетную запись домена, его каталог Users[имя пользователя] создается и копируется с сервера домена. Поэтому, если бы я составлял такой список в своей компании, я бы сделал что-то вроде получения списка пользователей домена через WMI, затем сопоставил этот список со списком локальных пользователей и удалил всех, кого нет в обоих. - person kitified; 22.05.2013

Вы можете перебрать каталог %windir%\Users, исключив имена папок по умолчанию (public/admin и т. д.), и проанализировать имена пользователей из имен файлов.

person Joshua Holden    schedule 22.05.2013
comment
Я думаю, что ОП уже рассмотрел это. GetEnvironmentVariable("USERPROFILE").Parent() это %windir%\Users - person Matthew Watson; 22.05.2013