Get-Process "Имя пользователя" возвращает мое собственное имя пользователя, когда ни один пользователь не вошел в систему на удаленной машине - PullRequest
2 голосов
/ 29 апреля 2019

Я использую Get-Process для запросов вошедших в систему пользователей удаленных машин.Это работает очень хорошо, но когда пользователь не вошел в систему, запрос возвращает мое собственное имя пользователя, как вошедшее в систему. Я просто хотел бы либо не выводить, когда пользователь не вошел в систему, или просто "Нет пользователя, вошедшего в системуon "появится в выходных данных.

Я пробовал маршрут WMI с:

Get-WmiObject -Class win32_LoggedOnUser -ComputerName $Comp

Но это возвращает слишком много выходных данных и очень трудно отфильтровать.

Я также попробовал маршрут CIM с:

(Get-CimInstance -ClassName CIM_ComputerSystem -ComputerName $Comp).UserName

CIM работает очень хорошо и дает желаемый вывод, но проблема в том, что большинство машин в моей среде не поддерживаютПротокол WS-Management, и поэтому они выдают ошибку при запросе.

Маршрут Get-Process работает лучше всего и работает быстро.Я просто не могу понять, как отфильтровать вывод, чтобы не показывать мое имя пользователя для удаленных компьютеров, на которых никто не вошел локально.

Invoke-Command -Computername $Comp -Scriptblock {
    Get-Process -IncludeUserName | Select-Object UserName | Where-Object { $_.UserName -ne $null -and $_.UserName.StartsWith("DomainName") } | Sort-Object SessionId -Unique
}

Когда пользователь вошел в систему локально на удаленной машине, его имя пользователяотображается на выходе.Когда пользователь не вошел в систему локально на удаленной машине, мое имя пользователя отображается в выходных данных.

Я бы хотел, чтобы либо ничего не отображалось, либо отображалось сообщение «Ни один пользователь не вошел в систему», когда ни один пользователь не вошел в систему.локально на удаленной машине.

1 Ответ

1 голос
/ 29 апреля 2019

Вы можете отфильтровать процесс, который запускает вашу команду удаленного взаимодействия (которая запускается в контексте ваше имя пользователя) по его идентификатору процесса, который отражается в автоматической переменной $PID внутри удаленно выполняемого блока скрипта.Invoke-Command -ComputerName:

В качестве отступления: имя процесса, в котором выполняется удаленная команда: wsmprovhost.

В контексте вашей команды:

Примечание. В PSv3 используйте Where-Object { $_.Id -ne $PID } вместо Where-Object Id -ne $PID ниже.

Invoke-Command -Computername $Comp -Scriptblock {
  Get-Process -IncludeUserName | 
    Where-Object Id -ne $PID |
      Select-Object UserName |
        Where-Object { $_.UserName -ne $null -and $_.UserName.StartsWith("DomainName") } | 
          Sort-Object UserName -Unique
}
  • Я изменился Sort-Object SessionId -Unique до Sort-Object UserName -Unique, при условии, что вы намерены перечислить уникальные имена пользователей.

  • В выводе по умолчанию отображаются не только имена пользователей, но и свойства .PSComputerName и .RunspaceId, которыеremoting автоматически украшает выходные объекты с помощью.

    • Если вы просто хотите использовать имена пользователей, добавьте Select-Object -ExpandProperty Username вместо Select-Object UserName и Sort-Object -Unique вместо Sort-Object UserName -Unique.
      • Примечание : Для некоторых процессов сообщается no username, что имеет место для процесса Idle (есть другие?).Это пустое имя пользователя исключается из вывода, если вы выводите только имена пользователей.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...