Я работаю над веб-контроллером для отображения и (в конечном итоге) изменения информации о домене для пользователей. В идеале мне нужно имя пользователя, полное имя, статус (заблокирован?) и вошли ли они в систему.
я зашел так далеко
# 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#.
Спасибо.
Write-Host $_.Properties ничего не выводит, а только отображает текст в буфере экрана, поэтому внутренний цикл ничем не отличается от $null |ForEach-Object { ... }




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 для передачи в Интернет.
Можно также заменить
GetWimObjectнаGet-CimInstance. Команды WIM недоступны в PowerShell 6+.