PowerShell ConvertFrom-Csv - PullRequest
       2

PowerShell ConvertFrom-Csv

0 голосов
/ 30 мая 2018

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

99% этого работает, как и ожидалось, но я далеко не гуру кода.У меня проблемы с получением правильного списка имен из строки 4, которая использует quser.Если я переключаюсь на использование строки 5 в качестве текста, код работает, как ожидалось.

Я не могу всю жизнь получить вывод из строки 4 в формат, который я могу использовать в остальной части кода.

Import-Module ActiveDirectory
$calgary = 0
$edmonton = 0
$users = (quser) -replace '\s{2,}', ',' | ConvertFrom-Csv | Select-Object USERNAME
$usersold = "Thomas", "Scott", "jeremy"
$groups = 'Domain Admins'

foreach ($user in $users) {
    foreach ($group in $groups) {
        $members = Get-ADGroupMember -Identity $group -Recursive | Select -ExpandProperty SamAccountName

        If ($members -contains $user) {
            $calgary = $calgary + 1
            Write-Host "$user is a member of $group"
            Write-Host "$group has $calgary logged in users"
        } Else {
            Write-Host "$user is not a member of $group"
        }
    }
}

Ответы [ 3 ]

0 голосов
/ 30 мая 2018

$users.GetType() возвращает массив элементов типа PSCustomObject, так что это объект со свойствами, а не просто список строк.

Когда вы делаете ($user in $users), то каждый $userэто объект со свойством USERNAME.Таким образом, у вас есть две опции:

Доступ к ИМЯ ПОЛЬЗОВАТЕЛЯ в цикле

Когда вам нужно имя пользователя внутри цикла, используйте $user.USERNAME

Получить список строк вместообъекты

Заменить строку 4 на:

$users = $((quser) -replace '\s{2,}', ',' | ConvertFrom-Csv | Select-Object USERNAME).USERNAME
0 голосов
/ 30 мая 2018

Я думаю, что лучший способ получить список вошедших в систему пользователей - это использовать Get-CimInstance для сбора сеансов, фильтрации для LogonType 3 (удаленный вход), а затем получить пользователей, связанных с этими идентификаторами входа.Затем, поскольку похоже, что вы хотите иметь возможность проверять несколько групп, я хотел бы получить членов для каждой группы и просто отметить, является ли каждый пользователь членом каждой группы.В конце я бы вывел таблицу всех сессий, включая информацию о том, в какие группы входит каждый пользователь и сколько пользователей вошло в каждую группу.

$LoggedOn = gcim Win32_LoggedOnUser
$GroupNames = 'pkiadmins'
$Groups = @{}
$GroupNames | ForEach-Object { $Groups.Add($_,(Get-ADGroupMember -Identity $_ -Recursive | Select -Expand SamAccountName)) }
$Sessions = gcim Win32_LogonSession -PipelineVariable Session|?{$_.LogonType -eq 3}|%{
    $SesUser = $LoggedOn|?{$_.Dependent.LogonId -eq $Session.LogonId}
    $SessionOut = [PSCustomObject]@{
        Domain = $SesUser.Antecedent.Domain
        User = $SesUser.Antecedent.Name
    }
    ForEach($Group in $GroupNames){
        Add-Member -InputObject $SessionOut -NotePropertyName $Group -NotePropertyValue ($SessionOut.User -in $Groups[$Group])
    }
    If($SessionOut.User -notmatch '\$$'){$SessionOut} #skip computer accounts
}
$Sessions|FT -Auto
ForEach($Group in $GroupNames){
    "Group '{0}' has {1} logged in user(s)" -f $Group,([array]($Sessions|?{$_.$Group})).Count
}
0 голосов
/ 30 мая 2018

В строке 4 попробуйте использовать:

$users = ((quser) -replace '\s{2,}', ',' | ConvertFrom-Csv | Select-Object USERNAME).username
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...