Как получить информацию о пользователе домена с контроллера с помощью WMI

Я работаю над веб-контроллером для отображения и (в конечном итоге) изменения информации о домене для пользователей. В идеале мне нужно имя пользователя, полное имя, статус (заблокирован?) и вошли ли они в систему.

я зашел так далеко

 # Define the target domain controller
 $domainController = "myController"
 # Hardcoded credentials (for demonstration purposes only, not recommended in production)
 $username = "[email protected]"
 $password = ConvertTo-SecureString "MyP@ssw03d!*" -AsPlainText -Force
 $credential = New-Object System.Management.Automation.PSCredential($username, $password)

 # Connect to the specified domain controller remotely using hardcoded credentials
 $sessionQuery = Get-WmiObject -Class Win32_LogonSession -ComputerName $domainController -Credential $credential

 $sessionQuery | ForEach-Object {
     Write-Host $_.Properties | ForEach-Object {
        $propertyData=[System.Management.PropertyData]$_
        Write-Host $($propertyData.Name)  $($propertyData.Value)
        Write-Host "----------------------"
    
     }
 }

Но единственные данные, которые он возвращает из Powershell, — это System.Management.PropertyData, повторяющиеся снова и снова. Даже разделитель не печатается.

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

Спасибо.

Можно также заменить GetWimObject на Get-CimInstance. Команды WIM недоступны в PowerShell 6+.

lit 10.05.2024 01:02
Write-Host $_.Properties ничего не выводит, а только отображает текст в буфере экрана, поэтому внутренний цикл ничем не отличается от $null |ForEach-Object { ... }
Mathias R. Jessen 10.05.2024 12:18
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
61
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Write-Host — неподходящий командлет для задания — он выводит выходные данные непосредственно на экран и не выдает никаких стандартных выходных данных, которые может использовать нижестоящий командлет. Отбросьте это полностью:

$dcCimSession = New-CimSession -ComputerName $domainController -Credential $credential
$sessionQuery = Get-CimInstance -ClassName Win32_LogonSession -CimSession $dcCimSession

$sessionQuery | ForEach-Object {
    # when using the CIM cmdlets, the meta-property you want is `CimInstanceProperties` - 
    $_.CimInstanceProperties | ForEach-Object {
        Write-Host "$($_.Name)  $($_.Value)"
        Write-Host '----------------------'    
    }
}
Ответ принят как подходящий

После дополнительных исследований я перешел с WMI на использование DirectorySearcher в C#:

 var builder = new ConfigurationBuilder()
   .SetBasePath(Directory.GetCurrentDirectory())
   .AddJsonFile("appsettings.json");
 var config = builder.Build();
 var admin = config.GetSection("Admin");

 // Set up the Directory Entry
 DirectoryEntry entry = new DirectoryEntry("LDAP://mcad2.local", admin.GetValue("userName", ""), admin.GetValue("password", ""));

 // Set up the Directory Searcher
 DirectorySearcher searcher = new DirectorySearcher(entry);
 searcher.Filter = "(&(objectCategory=person)(objectClass=user))"; // Filter to retrieve only user objects

 // Perform the Search
 SearchResultCollection r = searcher.FindAll();

Это дало мне информацию, которую я искал в активном каталоге, и ее можно легко преобразовать в JSON для передачи в Интернет.

Другие вопросы по теме