Извлечение идентификатора сеанса из команды пользователя запроса psexec / PowerShell

#windows #powershell #remote-desktop #rdp

#сеанс #powershell #rdp #psexec

Вопрос:

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

 $queryusers = $psexecdirectory   ' \'    $remotepc   ' -u '   $domain   ''   $username   ' -p '   $password   ' query user'
$results = iex $queryusers
  

Приведенное выше работает нормально, при этом приведенные ниже примеры результатов сохраняются в переменной $results

  USERNAME              SESSIONNAME        ID  STATE   IDLE TIME  LOGON TIME
 usr1                              3  Disc         1:12  9/5/2013 11:59
AM
>usr2          rdp-tcp#1           4  Active          .  9/5/2013 11:59
AM
  

Я использовал приведенное ниже, чтобы получить идентификатор, но номер в имени сеанса ‘rdp-ctp # 0’ изменяется, когда другой пользователь входит в систему, как в выводе выше, что делает его бесполезным:

 $id = $results | Select-String "$rdp-tcp#0s (w )" |
                 Foreach {$_.Matches[0].Groups[1].Value}
  

Я не знаком с синтаксисом PowerShell и не смог найти сайт, на котором объясняются параметры форматирования. Может ли кто-нибудь мне помочь? И если вы знаете веб-сайт, где я могу узнать больше об извлечении фрагментов из строк? Заранее спасибо.

Комментарии:

1. Или используйте больше powershell (на самом деле WMI), и вам не нужны ни psexec, ни строки. gallery.technet.microsoft.com/scriptcenter /…

Ответ №1:

Попробуйте это:

 $id = $results | ? { $_ -match '(d )s Active' } | % { $matches[1] }
  

Регулярное выражение (d )s Active будет соответствовать ключевому слову «Active», которому предшествует число, а последующий цикл возвращает первое подматчи (т. Е. Число).

Комментарии:

1. Это сработало как шарм, спасибо. Я обязательно прочитаю о регулярных выражениях.