Powershell在PSSession中使用Start-Process打开记事本

Col*_*337 4 powershell start-process powershell-3.0

我在远程计算机上创建了一个pssession并输入了这个属性.在该会话中,我使用start-process启动记事本.我可以确认记事本是使用get-process命令运行的,还是使用远程计算机中的taskmgr运行.但是,该过程的GUI端未显示.这是我一直在使用的序列:

$server = New-PSSession -ComputerName myserver -Credential mycreds
Enter-PSSession $server

[$server]: PS C:\>Start-Process notepad -Wait -WindowStyle Maximized
Run Code Online (Sandbox Code Playgroud)

该过程正在运行,但是当RDP到框时,记事本无法打开.如果我从服务器打开记事本,则会开始一个新的记事本过程.我也试过使用这样的动词参数:

[$server]: PS C:\>Start-Process notepad -Wait -WindowStyle Maximized -Verb Open
Run Code Online (Sandbox Code Playgroud)

同样的结果......过程开始,但没有记事本显示.我已经尝试了这个远程进入盒子(但是从我的本地主机发出)以及远程进入服务器之前.

Lar*_*ens 12

这是因为远程计算机上的powershell会话不会进入任何可见桌面,而是进入不可见的系统桌面.powershell远程会话的接收端是Windows服务.这个过程已经开始,但你和其他任何人都无法看到它.

如果你考虑一下,由于多个用户可以RDP到同一台机器,所以没有理由认为远程PowerShell会话最终会显示在任何用户桌面上.实际上,几乎在所有情况下你都不会想要它.

带有-i参数的psexec能够执行您想要的操作,但您必须指定要将其显示在哪个会话(用户)中.

  • 反正有没有让GUI使用Powershell而不是psexec? (6认同)

Ben*_*Ben 6

我知道这是旧的,但我遇到了它自己寻找解决方案,所以我想更新它为未来可怜的灵魂.

此问题的本机解决方法是使用计划任务.那将使用活动会话

function Start-Process-Active
{
    param
    (
        [System.Management.Automation.Runspaces.PSSession]$Session,
        [string]$Executable,
        [string]$Argument,
        [string]$WorkingDirectory,
        [string]$UserID

    )

    if (($Session -eq $null) -or ($Session.Availability -ne [System.Management.Automation.Runspaces.RunspaceAvailability]::Available))
    {
        $Session.Availability
        throw [System.Exception] "Session is not availabile"
    }

    Invoke-Command -Session $Session -ArgumentList $Executable,$Argument,$WorkingDirectory,$UserID -ScriptBlock {
        param($Executable, $Argument, $WorkingDirectory, $UserID)
        $action = New-ScheduledTaskAction -Execute $Executable -Argument $Argument -WorkingDirectory $WorkingDirectory
        $principal = New-ScheduledTaskPrincipal -userid $UserID
        $task = New-ScheduledTask -Action $action -Principal $principal
        $taskname = "_StartProcessActiveTask"
        try 
        {
            $registeredTask = Get-ScheduledTask $taskname -ErrorAction SilentlyContinue
        } 
        catch 
        {
            $registeredTask = $null
        }
        if ($registeredTask)
        {
            Unregister-ScheduledTask -InputObject $registeredTask -Confirm:$false
        }
        $registeredTask = Register-ScheduledTask $taskname -InputObject $task

        Start-ScheduledTask -InputObject $registeredTask

        Unregister-ScheduledTask -InputObject $registeredTask -Confirm:$false
    }

}
Run Code Online (Sandbox Code Playgroud)