Я нахожусь в процессе написания сценария, который берет на себя вывод команды Sysinternals:. Psloggedon.exe и выводит имя компьютера и что пользователи подписываются вPowerShell: заполнить пользовательский объект с переменным содержанием
Я в настоящее время имеют сценарий, производящий следующие возможности в зависимости от того, какой вывод выдается каждому компьютеру при запросе.
DOMAIN \ компьютер-name01
DOMAIN имя пользователя \DOMAIN \ компьютер-name02
DOMAIN имя пользователя \
DOMAIN имя пользователя \DOMAIN \ компьютер-name03
Ошибка подключенияDOMAIN \ computer-name04
Ни один пользователь не подписан в
Каждый блок данных всегда будет иметь имя компьютера, затем либо список пользователей, вход, сообщение об ошибке, или сообщение о том, что никто не будет подписан в.
Я хотел бы присвоить данные настраиваемому объекту, чтобы я мог выводить его в CSV. Насколько я понимаю, это лучший способ создать правильный CSV.
Где я смущаюсь с пользовательским объектом, как я могу справиться с ситуацией, когда входящие данные изменяются в размере? Так, например, у меня может быть компьютер, в который вошли 4 человека. Я также не понимаю, как создать заголовки столбцов. Большинство примеров, которые я нашел, данные, которые подаются в пользовательский объект, уже имеют собственные заголовки столбцов или свойства.
Ищу для вывода данных, так что он выглядит как компьютерный имя-под
DOMAIN \, \-доменное имя пользователя, домен \ пользователь имя-
компьютер-имя \ DOMAIN, ошибки
-имя компьютера \ DOMAIN сообщение, никто не подписал в
колонка заголовка над именем компьютера будет «имя компьютера» и заголовок не подписанная в сообщении пользователя/ошибки/не один подписанный в бы "Положение дел".
Microsoft имеет это довольно хорошо документированы, кажется: https://technet.microsoft.com/en-us/library/ff730946.aspx
В этом примере я не понимаю, где «$ objBatter.Name» приходит. Как скрипт знает заголовок свойства или столбца из ввода? Имеются ли уже введенные данные?
Извините за то, что вы так смущаетесь, мне тяжело обволакивать вокруг меня мозг, поэтому объяснять это сложно.
Вот что я пробовал. Но в основном пользовательский объект просто выводит свойства/заголовки столбцов (извините, я не совсем уверен, что это называется). Остальное пусто.
$Computers = @(
,"computer-name01"
)
Foreach ($Computer in $Computers)
{
$loggedon = $null
If (Test-Connection -ComputerName $Computer -Quiet -Count 1)
{
$loggedon = (PsLoggedon.exe -x -l \\$Computer | Where-Object { ($_ -like "*DOMAIN\*" -or $_ -like "*No one*" -or $_ -like "*$Computer\*" -or $_ -like "*Error opening*")}).trim()
if ($loggedon -like "*Error Opening*")
{
Write-Output "Error occurred while attempting to connect. This computer is online."
Continue
} else {
$loggedon = ,"$Computer" + $loggedon
$colComputerAndUser = @()
foreach ($item in $loggedon)
{
$ObjComputerAndUser = New-Object System.Object
$ObjComputerAndUser | Add-Member -Type NoteProperty -Name Computer -Value $item.Computer
$ObjComputerAndUser | Add-Member -Type NoteProperty -Name User -Value $item.User
$colComputerAndUser += $ObjComputerAndUser
}
$colComputerAndUser
}
}
}
UPDATE 01
Я попытался использовать код при условии. Он работал по назначению, но я получаю странное поведение, если компьютер возвращает более одного человека, подписавшегося. Внутри пользовательского объекта компьютер будет отображаться несколько раз.
$Computers = @(
,"computer01"
,"computer02"
)
$colComputerAndUser = @()
Foreach ($Computer in $Computers)
{
$loggedon = $null
If (Test-Connection -ComputerName $Computer -Quiet -Count 1)
{
$loggedon = (PsLoggedon.exe -x -l \\$Computer | Where-Object { ($_ -like "*DOMAIN\*" -or $_ -like "*No one*" -or $_ -like "*$Computer\*" -or $_ -like "*Error opening*")}).trim()
$loggedon = [string]$loggedon
$ObjComputerAndUser = New-Object PSObject
$ObjComputerAndUser | Add-Member -Type NoteProperty -Name Computer -Value $Computer
$ObjComputerAndUser | Add-Member -Type NoteProperty -Name User -Value $loggedon
$colComputerAndUser += $ObjComputerAndUser
}
$colComputerAndUser
}
Компьютер пользователя
-------- ----
computer01 DOMAIN \ user01 DOMAIN \ user02
computer01 DOMAIN \ user01 DOMAIN \ user02
computer02 DOMAIN \ user03
Update 02
Образец 01 из PsLoggedon.exe - неотредактированный
PsLoggedon v1.35 - See who's logged on
Copyright (C) 2000-2016 Mark Russinovich
Sysinternals - www.sysinternals.com
Users logged on locally:
DOMAIN\user.name01
DOMAIN\user.name02
Образец 02 из PsLoggedon.exe - неотредактированный
PsLoggedon v1.35 - See who's logged on
Copyright (C) 2000-2016 Mark Russinovich
Sysinternals - www.sysinternals.com
Users logged on locally:
LOCALMACHINE\local.user01
LOCALMACHINE\local.user04
DOMAIN\user.name15
DOMAIN\user.name17
UPDATE 03 Этого код был на самом деле работает, но я поместил вне в неправильной части кода.
$Computers = @(
,"computer01"
,"computer02"
,"computer03"
,"computer04"
,"computer05"
)
$colComputerAndUser = @()
Foreach ($Computer in $Computers)
{
$loggedon = $null
If (Test-Connection -ComputerName $Computer -Quiet -Count 1)
{
$loggedon = (PsLoggedon.exe -x -l \\$Computer | Where-Object { ($_ -like "*DOMAIN\*" -or $_ -like "*No one*" -or $_ -like "*$Computer\*" -or $_ -like "*Error opening*")}).trim()
$loggedon = [string]$loggedon
$ObjComputerAndUser = New-Object PSObject
$ObjComputerAndUser | Add-Member -Type NoteProperty -Name Computer -Value $Computer
$ObjComputerAndUser | Add-Member -Type NoteProperty -Name User -Value $loggedon
$colComputerAndUser += $ObjComputerAndUser
}
}
$colComputerAndUser
Здесь, где этот код отличается, размещается конечный $ colComputerNameUser. первоначально я содержал его внутри цикла foreach, что вызвало дублирование вывода. Теперь это происходит после цикла, и выход работает правильно.
Я попытался реализовать то, что вы предложили. Он работает, за исключением того, что я получаю повторение вывода, если компьютер возвращает больше одного пользователя. Я подозреваю, что пропустил деталь. Я не совсем уверен, что вы подразумеваете, объединяя все значения после ComputerName. Вы имеете в виду, что все они превращаются в переменную? Или просто убедитесь, что все значения находятся в одной строке? Извините за мое невежество, это намного более продвинуто, чем я привык. – bourne
Можете ли вы опубликовать образец вывода из PsLoggedon.exe? – Arluin
В UPDATE 02 Я добавил некоторые неотредактированные данные из PsLoggedon.exe (за исключением фактического домена). Я считаю, что дубликат в пользовательском объекте возможен из-за того, что некоторые компьютеры могут возвращать более одного пользователя. Что-то странное происходит, когда мы добавляем значения к объекту. – bourne