none
PowerShell Script RRS feed

  • Вопрос

  • Здравствуйте. Поставлена задача определять на каком компьютере залогинелся пользователь, знаю имя учетной записи, найти рабочую станцию на котором он залогинен. Решил все это дело оформить в виде скрипта.

    Собственно сам скрипт

    $hsts = Get-Content -Path $path
    
             function Get-LoggedOnUser
     {
         [CmdletBinding()]
         param
         (
             [Parameter()]
             [ValidateScript({ Test-Connection -ComputerName $_ -Quiet -Count 1 -ErrorAction SilentlyContinue})]
             [ValidateNotNullOrEmpty()]
             [string[]]$ComputerName = $env:COMPUTERNAME
         )
         foreach ($comp in $ComputerName)
         {
             $output = @{ 'ComputerName' = $comp }
             $output.UserName = (Get-WmiObject -Class win32_computersystem -ComputerName $comp).UserName
             [PSCustomObject]$output
         }
     }
     
    
    $users = foreach ($hst in $hsts) {
    
    Get-LoggedOnUser -ComputerName $hst -ErrorAction SilentlyContinue  | Format-Table -AutoSize} 
    
    $usr = read-host "Enter username account in format 'username'"
    
    if ($usr -match $users.username) {
            Write-host "Found a Match"
           $users | Where-Object {$_.UserName -eq $usr}
            }
            else {
            Write-Host "Match not found"
            }

    Результат вывода переменной $users выглядит в таком формате

    ComputerName     UserName

    host-1                  domain\ivanov1

    ComputerName     UserName

    host-2                  domain\ivanov2

    Далее скрипт предлагает в перменную $usr ввести имя учетной записи к применру "domain\ivanov1". В случае если совпадение найдены в переменной $users. То на экарн выводится только то значение которой соответствует значение переменной $usr. В идеале хотелось бы получить такой вид:

    Found a Match

    ComputerName     UserName

    host-1                  domain\ivanov1

    Подскажите, пожалуйста, каким образом можно оформить такой вывод?

    Заранее спасибо.


    25 декабря 2017 г. 15:06

Ответы

  • $users = foreach ($hst in $hsts) {
    	Get-LoggedOnUser -ComputerName $hst -ErrorAction SilentlyContinue
    } 
    
    $usr = read-host "Enter username account in format 'username'"
    $user = $users | Where {$_.UserName -eq $usr}
    
    if ($user) {
        Write-host "Found a Match"
        $user
    }
    else {
        Write-Host "Match not found"
    }

    • Предложено в качестве ответа Sergey Ya 25 декабря 2017 г. 23:53
    • Помечено в качестве ответа ReMCatcheR 26 декабря 2017 г. 12:46
    25 декабря 2017 г. 16:04
    Отвечающий

Все ответы

  • Здравствуйте!

    $obj = New-Object PSObject
    $obj | Add-Member noteproperty ComputerName "" 
    $obj | Add-Member noteproperty UserName "" 
    
    $array = @()
    $array += New-Object PSObject -Property @{ComputerName="Comp"; UserName="User"}
    
    $obj = $array



    Пардон, это совершенно не то, что вам нужно :D

    Правильный ответ ниже

    • Изменено Sergey Ya 25 декабря 2017 г. 23:53
    25 декабря 2017 г. 16:03
  • $users = foreach ($hst in $hsts) {
    	Get-LoggedOnUser -ComputerName $hst -ErrorAction SilentlyContinue
    } 
    
    $usr = read-host "Enter username account in format 'username'"
    $user = $users | Where {$_.UserName -eq $usr}
    
    if ($user) {
        Write-host "Found a Match"
        $user
    }
    else {
        Write-Host "Match not found"
    }

    • Предложено в качестве ответа Sergey Ya 25 декабря 2017 г. 23:53
    • Помечено в качестве ответа ReMCatcheR 26 декабря 2017 г. 12:46
    25 декабря 2017 г. 16:04
    Отвечающий
  • при таком оформлении выполняется второе условие:

    Match not Found

    Хотя указанный пользователь есть в списке переменной $users

    $usr = read-host "Enter username account in format 'username'"
    $user = $users | Where {$_.UserName -eq $usr}
    if ($user) {
            Write-host "Found a Match"
           $user
            }
            else {
            Write-Host "Match not found"
            }
    Enter username account in format 'username': ivanov1
    Match not found

    26 декабря 2017 г. 6:19
  • А в переменная $user остается пустой после указания учетной записи пользователя в переменную $usr
    26 декабря 2017 г. 6:22
  • Формат пользователя должен быть аналогичен в $users: DOMAIN\UserName , а не просто UserName. Если требуется указывать без домена, то заменить на -match:

    Where {$_.UserName -match $usr}

    26 декабря 2017 г. 6:25
    Отвечающий
  • Именно в таком формате и указываю DOMAIN\UserName. 

    Enter username account in format 'username': domain\ivanov1, забыл в комментарии дописать.

    $user = $users | Where {$_.UserName -eq $usr}

    Но эта строка не отрабатывает, пробовал и -match и  -eq

    Но пробовал и просто указывать без domain\, результат тот же. 

    26 декабря 2017 г. 6:32
  • Показывайте скрин, где вывод:

    $users = Get-LoggedOnUser -ComputerName $env:computername -ErrorAction SilentlyContinue
    #Текущий пользователь
    $usr = read-host "Enter username account in format 'username'"
    # Вывод
    $users | Where {$_.UserName -match [regex]::escape($usr)}

    26 декабря 2017 г. 6:46
    Отвечающий
  • При таком оформлении скрипт будет пробегаться по всем компьютерам в домене? Он запускается не локально на каждом компе, а по необходимости, с одной рабочей станции, и должен бегать по всем рабочим станциям.

    $users = Get-LoggedOnUser -ComputerName $env:computername -ErrorAction SilentlyContinue

    Данное оформление вроде настроено либо на распространение скрипта через ГПО, либо локально на одном компе. В моем же случае, скрипт нужно запускать локально на одной тачке, но что бы он пробегался по всем компам в домене. для этого опубликовывалась переменная $hsts

    26 декабря 2017 г. 7:13
  • Часть кода была представлена, лишь для диагностики правильного ввода не более того. Т.к. упорно не хотите показывать, то приведу пример, что все отрабатывает, как и должно.

    26 декабря 2017 г. 7:27
    Отвечающий
  • PS C:\WINDOWS\system32> $users ... ComputerName UserName ------------ -------- domain-WS63 domain\9127

    ...

    PS C:\WINDOWS\system32> $usr
    domain\9127

    PS C:\WINDOWS\system32> $user = $users | Where {$_.UserName -match [regex]::escape($usr)} if ($user) { Write-host "Found a Match" $user } else { Write-Host "Match not found" } Match not found PS C:\WINDOWS\system32>


    26 декабря 2017 г. 11:54
  • В начале самом в заголовке я писал что:

    Результат вывода переменной $users выглядит в таком формате

    ComputerName     UserName

    host-1                  domain\ivanov1

    ComputerName     UserName

    host-2                  domain\ivanov2

    Мне кажется в этом проблема, как можно оформить эту завись в такой вид:

    ComputerName     UserName

    host-1                  domain\ivanov1

    host-2                  domain\ivanov2

    26 декабря 2017 г. 12:01
  • Где участок кода с Get-LoggedOnUser ?
    26 декабря 2017 г. 12:02
    Отвечающий
  • Там офигенно большой список в котором указаны все компы и учетные записи домена, которые я не хочу сюда вписывать, но принцип вывода этого участка, я указал чуть выше
    26 декабря 2017 г. 12:03
  • Там офигенно большой список в котором указаны все компы и учетные записи домена, которые я не хочу сюда вписывать, но принцип вывода этого участка, я указал чуть выше

    Участок кода, а не его вывод. Где с вероятностью 99% присутсвует ошибка , строка с 

    Format-Table -AutoSize , которой не должно быть.
    • Изменено KazunEditor 26 декабря 2017 г. 12:06
    26 декабря 2017 г. 12:05
    Отвечающий
  •          function Get-LoggedOnUser
     {
         [CmdletBinding()]
         param
         (
             [Parameter()]
             [ValidateScript({ Test-Connection -ComputerName $_ -Quiet -Count 1 -ErrorAction SilentlyContinue})]
             [ValidateNotNullOrEmpty()]
             [string[]]$ComputerName = $env:COMPUTERNAME
         )
         foreach ($comp in $ComputerName)
         {
             $output = @{ 'ComputerName' = $comp }
             $output.UserName = (Get-WmiObject -Class win32_computersystem -ComputerName $comp).UserName
             [PSCustomObject]$output
         }
     }
    
    $users = foreach ($hst in $hsts) {
    
    Get-LoggedOnUser -ComputerName $hst -ErrorAction SilentlyContinue  | Format-Table -AutoSize} 

    26 декабря 2017 г. 12:07
  • Должно быть, что я и написал в первом посте.

    $users = foreach ($hst in $hsts) {
    	Get-LoggedOnUser -ComputerName $hst -ErrorAction SilentlyContinue
    } 


    • Изменено KazunEditor 26 декабря 2017 г. 12:08
    26 декабря 2017 г. 12:08
    Отвечающий
  • ок, сейчас проганю еще раз, отпишусь.
    26 декабря 2017 г. 12:08
  • Помогло. Объясните пожалуйста, чем так мешал Format-table -AutoSize?
    26 декабря 2017 г. 12:23
  • Помогло. Объясните пожалуйста, чем так мешал Format-table -AutoSize?

    Формируется объект у которо уже нет заданных свойств. Поэтому и сравнивать  нечего уже.

    PS > [pscustomobject]@{UserName="Test";ID=1} | Format-Table | Get-Member
    
    
       TypeName: Microsoft.PowerShell.Commands.Internal.Format.FormatStartData
    
    Name                                    MemberType Definition
    ----                                    ---------- ----------
    Equals                                  Method     bool Equals(System.Object obj)
    GetHashCode                             Method     int GetHashCode()
    GetType                                 Method     type GetType()
    ToString                                Method     string ToString()
    autosizeInfo                            Property   Microsoft.PowerShell.Commands.I
    ClassId2e4f51ef21dd47e99d3c952918aff9cd Property   string ClassId2e4f51ef21dd47e99
    groupingEntry                           Property   Microsoft.PowerShell.Commands.I
    pageFooterEntry                         Property   Microsoft.PowerShell.Commands.I
    pageHeaderEntry                         Property   Microsoft.PowerShell.Commands.I
    shapeInfo                               Property   Microsoft.PowerShell.Commands.I

    В отличие от:

    PS > [pscustomobject]@{UserName="Test";ID=1} | Get-Member
    
    
       TypeName: System.Management.Automation.PSCustomObject
    
    Name        MemberType   Definition
    ----        ----------   ----------
    ID          NoteProperty int ID=1
    UserName    NoteProperty string UserName=Test
    
    

    26 декабря 2017 г. 12:30
    Отвечающий
  • Теперь понятно, спасибо большое )))
    26 декабря 2017 г. 12:46