2016-09-30 2 views
0

Я нахожусь в процессе написания сценария, который берет на себя вывод команды 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, что вызвало дублирование вывода. Теперь это происходит после цикла, и выход работает правильно.

ответ

1

Сделайте объект с двумя свойствами: имя_компьютера, пользователи. Объединить все значения после имени ComputerName в строку и присвоить строку атрибуту Users.

$Computers = @(,"computername") 

Foreach ($Computer in $Computers) 
{ 
$loggedon = $null 
if (Test-Connection -ComputerName $Computer -Quiet -Count 1){ 
    $loggedon = (.\PsLoggedon.exe -x -l \\$Computer) 

    if ($loggedon -like "*Error Opening*"){ 
     Write-Output "Error occurred while attempting to connect. This computer is online." 
     Continue 
    } else { 
     $loggedon = ,"$Computer" + $loggedon 

     $colComputerAndUser = @() 

     $UserString = "" 
     for($Cnt = 9;$Cnt -lt $loggedon.Count;$Cnt++) 
     { 
      $UserString += ($loggedon[$Cnt]).Trim() + "`n" 
     } 
     $ObjComputerAndUser = New-Object System.Object 
     $ObjComputerAndUser | Add-Member -Type NoteProperty -Name Computer -Value $Computer 
     $ObjComputerAndUser | Add-Member -Type NoteProperty -Name User -Value $UserString 
     $colComputerAndUser += $ObjComputerAndUser 
    } 
    } 
} 
$colComputerAndUser | format-table -wrap 

Не моя самая элегантная работа, но она работает. Мне не нравится жесткое кодирование начала подсчета массива до 9. Я попытался разбить двоеточие, но он просто разбился на каждый `n в выводе PsLoggedon. Я могу попытаться уточнить это позже. Я также пробовал глобальное регулярное выражение для соответствия [regex] '(? [^ \]) ​​\ (?. *)', Но это тоже не сработало. Я получил результаты, но не смог перечислить результаты.

+0

Я попытался реализовать то, что вы предложили. Он работает, за исключением того, что я получаю повторение вывода, если компьютер возвращает больше одного пользователя. Я подозреваю, что пропустил деталь. Я не совсем уверен, что вы подразумеваете, объединяя все значения после ComputerName. Вы имеете в виду, что все они превращаются в переменную? Или просто убедитесь, что все значения находятся в одной строке? Извините за мое невежество, это намного более продвинуто, чем я привык. – bourne

+0

Можете ли вы опубликовать образец вывода из PsLoggedon.exe? – Arluin

+0

В UPDATE 02 Я добавил некоторые неотредактированные данные из PsLoggedon.exe (за исключением фактического домена). Я считаю, что дубликат в пользовательском объекте возможен из-за того, что некоторые компьютеры могут возвращать более одного пользователя. Что-то странное происходит, когда мы добавляем значения к объекту. – bourne

Смежные вопросы