Powershell - mstsc-проблема Register-ObjectEvent - событие не было запущено в нужное время - PullRequest
0 голосов
/ 26 апреля 2018

В настоящее время я пишу сценарий powershell (5.0) для запуска и управления окончанием сеансов RDP на тонких клиентах Windows.

После завершения сеанса RDP сценарий выполняет определенную функцию. Для этого mstsc запускается как процесс (с командлетом Start-Process ). Затем Register-ObjectEvent используется для регистрации и перехвата события Exited процесса mstsc.

Когда mstsc запускается без параметра -ArgumentList (как показано в примере ниже), все работает нормально. Событие Exited наступает, как только заканчивается сеанс RDP или когда диалоговое окно входа в RDP закрывается до входа в систему.

$rdpSession = Start-Process -FilePath mstsc -PassThru
$RegisteredEvent = Register-ObjectEvent -InputObject $rdpSession -EventName Exited -Action {rdpSessionEnd} -Verbose 

Использование параметра -ArgumentList для указания пользовательского пути к файлу rdp (как показано в примере ниже) приводит к возникновению события Exited сразу после запуска процесса mstsc, не дожидаясь окончания сеанса rdp.

$rdpSession = Start-Process -FilePath mstsc -ArgumentList C:\RDS\RDS.rdp -PassThru 
$RegisteredEvent = Register-ObjectEvent -InputObject $rdpSession -EventName Exited -Action {rdpSessionEnd}

Скрипт должен быть запущен в 64-битной Windows. Ранее я читал о необходимости запускать версию mstsc из папки system32 или SysWOW64 в зависимости от того, какая ОС является 32- или 64-битной версией. Использование обоих экземпляров mstsc.exe с полным путем не решило проблему.

Любая помощь будет принята с благодарностью!

1 Ответ

0 голосов
/ 02 мая 2018

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

Действительно, первый процесс mstsc запускает дочерний процесс mstsc, а затем завершает сам себя.

Поступив таким образом, выполнил задание (см. Сокращенный и неоптимизированный код ниже в качестве примера):

  1. Запуск «родительского» процесса mstsc с использованием параметра файла rdp.

  2. Регистрация «завершенного» события «родительского» процесса таким образом, чтобы при поднял, заявление зарегистрировать «выход» события «ребенка» Процесс mstsc для запуска определенной функции (в предположении «дочерний») Процесс был создан до выхода из родительского процесса и что дочерний процесс является единственным оставшимся "mstsc" с именем выполнения процесс).

  3. Завершение или прерывание сеанса rdp поднимает дочерний mstsc процесс "вышел" и запускает зарегистрированную функцию.

    function registerRdpSessionExitedEvent {
        # Registering the "exited" event of the child process (the rdp session itself) to run the <rdpSessionEnd> function when raised
    
        $rdpSession = Get-Process -Name mstsc
        $rdpSessionExitedEvent  = Register-ObjectEvent -InputObject $rdpSession -EventName Exited -Action {rdpSessionEnd}
    }
    
    function rdpSessionEnd {
        # To be run when the rdp session has ended or has been aborted by user
        <Some statements...>
    }
    
    
     #1. Starting the parent mstsc process using the rdp file parameter.
     $mstscLauncher = Start-Process -FilePath mstsc -ArgumentList C:\RDS\RDS.rdp -PassThru 
    
    #2. Registering the "exited" event of the "parent" process to run the <registerRdpSessionExitedEvent> function when raised
    $mstscLauncherExitedEvent =  Register-ObjectEvent -InputObject $mstscLauncher -EventName Exited -Action {registerRdpSessionExitedEvent} 
    

Большое спасибо!

...