2013-09-05 4 views
1

Я пишу сценарий PowerShell, чтобы узнать идентификатор сеанса активного пользователя на удаленном компьютере, чтобы затем запустить программу, используя этот идентификатор сеанса. Вот что я до сих пор.Извлечь идентификатор сеанса из пользовательской команды 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#0\s+(\w+)" | 
       Foreach {$_.Matches[0].Groups[1].Value} 

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

+0

Или используйте больше powershell (на самом деле WMI), и вам не нужны psexec или string fiddeling. http://gallery.technet.microsoft.com/scriptcenter/0e43993a-895a-4afe-a2b2-045a5146048a –

ответ

2

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

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

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

+0

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