2016-08-29 6 views
4

настоящее время у меня следующий запрос в PowerShell:Легче способ разбора «запроса пользователя» в PowerShell

query user /server:$server 

который возвращает результат:

USERNAME    SESSIONNAME  ID STATE IDLE TIME LOGON TIME 
svc_chthost        2 Disc   1:05 8/16/2016 12:01 PM 
myusername    rdp-tcp   3 Active   . 8/29/2016 11:29 AM 

В настоящее время я использую @(query user /server:$server).Count - 1 в качестве значения для представления количества зарегистрированных пользователей (это не очень, я знаю). Однако теперь я хотел бы получить информацию, такую ​​как USERNAME, ID и LOGON TIME для использования в других частях моего сценария.

Мой вопрос связан с более простым способом анализа информации выше, или, может быть, лучшим решением для моей проблемы все вместе: подсчет и сбор информации, связанной с входом в систему пользователей.

Я нашел другие решения, которые, кажется, работают лучше, но я уверен, что там должно быть более простым способом для выполнения этой задачи:

$ComputerName | Foreach-object { 
$Computer = $_ 
try 
    { 
     $processinfo = @(Get-WmiObject -class win32_process -ComputerName $Computer -EA "Stop") 
      if ($processinfo) 
      {  
       $processinfo | Foreach-Object {$_.GetOwner().User} | 
       Where-Object {$_ -ne "NETWORK SERVICE" -and $_ -ne "LOCAL SERVICE" -and $_ -ne "SYSTEM"} | 
       Sort-Object -Unique | 
       ForEach-Object { New-Object psobject -Property @{Computer=$Computer;LoggedOn=$_} } | 
       Select-Object Computer,LoggedOn 
      }#If 
    } 
catch 
    { 

    } 
+2

Я считаю, несколько странно, что я не могу найти решение «чистого Powershell». Кто-то еще нашел время, чтобы создать сценарий, чтобы сделать то, что вам нужно, но: https://gallery.technet.microsoft.com/scriptcenter/Get-UserSessions-Parse-b4c97837 – Poorkenny

+1

Смотрите также: https: //sysadminasaservice.wordpress.com/2015/08/10/quser-and-powershell/ – sodawillow

ответ

1

Потрясающих ссылок в комментариях, и по-прежнему открыты для больше ответов на этот вопрос, поскольку оно должно иметь более легкое решение!

foreach ($s in $servers) #For Each Server 
{ 
    foreach($ServerLine in @(query user /server:$s) -split "\n") #Each Server Line 
    { 
     #USERNAME    SESSIONNAME  ID STATE IDLE TIME LOGON TIME 

     $Parsed_Server = $ServerLine -split '\s+' 

     $Parsed_Server[1] #USERNAME 
     $Parsed_Server[2] #SESSIONNAME 
     $Parsed_Server[3] #ID 
     $Parsed_Server[4] #STATE 
     $Parsed_Server[5] #IDLE TIME 
     $Parsed_Server[6] #LOGON TIME 
    } 
} 

Это решение решает проблему на данный момент, вроде неряшливой.

Для более решений в углубленном с большим количеством функциональных возможностей, проверьте комментарии к первоначальному вопросу :)

+0

Что такое «неряшливый», и хотите ли вы здесь изменить? (Попробуйте подвести итог в одном комментарии, у нас не будет много разрешенных: -p - На данный момент я пытаюсь отполировать код из моего комментария выше) – sodawillow

+0

Просто 'foreach (split) {foreach (split) { }} 'Продолжаем. Я уверен, что есть более простой способ проанализировать информацию. Честно говоря, это лучшее решение, которое я мог бы предложить без чрезмерного усложнения решения. Поскольку пользователь запросов (quser) уже делает то, что я хотел бы сделать. В основном я ищу решение для управления выходом. Ваше решение вместе со ссылкой @Poorkenny работает очень хорошо, я просто придирчив к коротким и сладким решениям: P Итак, я думаю, что это решение не слишком неряшливо - я просто хочу, чтобы было короче способ их сортировки в управляемые объекты. –

-1

I Далее приложенном выше код правильно форматировать, а также рассмотреть отключенных пользователей

$HaSH = @() 
foreach($ServerLine in @(query user) -split "\n") { 
    $Report = "" | Select-Object UserName, Session, ID, State, IdleTime, LogonTime 
    $Parsed_Server = $ServerLine -split '\s+' 
    if($Parsed_Server -like "USERNAME*") { 
    Continue 
    } 
    $Report.UserName = $Parsed_Server[1] 
    $Report.Session = $Parsed_Server[2] 
    $Report.ID = $Parsed_Server[3] 
    $Report.State = $Parsed_Server[4] 
    $Report.IdleTime = $Parsed_Server[5] 
    $Report.LogonTime = $Parsed_Server[6]+" " +$Parsed_Server[7]+" "+$Parsed_Server[8] 

    if($Parsed_Server[3] -eq "Disc") { 
     $Report.Session = "None" 
     $Report.ID = $Parsed_Server[2] 
     $Report.State = $Parsed_Server[3] 
     $Report.IdleTime = $Parsed_Server[4] 
     $Report.LogonTime = $Parsed_Server[5]+" " +$Parsed_Server[6]+" "+$Parsed_Server[7] 
    } 

    if($Parsed_Server -like ">*") { 
     $Parsed_Server=$Parsed_Server.Replace(">","") 
     $Report.UserName = $Parsed_Server[0] 
     $Report.Session = $Parsed_Server[1] 
     $Report.ID = $Parsed_Server[2] 
     $Report.State = $Parsed_Server[3] 
     $Report.IdleTime = $Parsed_Server[4] 
     $Report.LogonTime = $Parsed_Server[5]+" " +$Parsed_Server[6]+" "+$Parsed_Server[7] 
    } 
    $HaSH+=$Report 
} 

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

  • Нет связанных вопросов^_^