【问题标题】:Runas in another Windows terminal session在另一个 Windows 终端会话中运行
【发布时间】:2014-11-13 14:11:03
【问题描述】:

为简单起见,假设用户Administrator 登录到终端会话2。另一个用户Boda 登录到终端会话3

是否可以从会话2runas 会话3 中的程序?

为简单起见,假设我想在会话 3(在 Boda 的会话中)启动 calc.exe。我怎么做?可以用runas完成吗?

【问题讨论】:

  • 我坚信这是一个Super User 的问题。投票迁移。
  • 谢谢。我无法向超级用户发帖,因为我通过提出愚蠢的问题违反了一些审核规则。
  • 如何进行迁移?我在这个网站上有很强的业力,所以我也可以写迁移。
  • 如果您可以访问问题下方的关闭链接,请转至off topic because... -> belongs on another site -> superuser.com。不过,如果您对另一方有限制,不确定是否可以迁移问题。
  • FWIW,答案是“不”。您不能跨会话使用 runas。但是,您可以在代码中执行此操作,尽管这有点棘手。

标签: windows terminal-services runas


【解决方案1】:

就像 Harry Johnston 在评论中建议的那样,您可以使用 psexec 工具 available on TechNet 执行此操作。我已经尝试使用运行终端服务的 Windows 2008 Server 并设法在另一个用户会话中启动各种应用程序(虽然不是 calc.exe - 它已启动但已最小化并且窗口拒绝恢复),其中包括 cmd.exe。

我使用的命令是psexec.exe -i 3 cmd.exe,其中3 是会话号(可以从qwinsta.exe 获得)。

示例:远程会话,以管理员身份登录;使用 qwinsta 枚举会话并使用 psexec 在另一个会话上启动 cmd.exe

另一个会话:以 Patrick 身份登录,桌面上的 cmd.exe 窗口由管理员打开(窗口标题也显示)。

【讨论】:

  • 它打开了程序,但是 GUI 是残废的。
【解决方案2】:

有一个命令行工具,名为RunInSession。您至少需要指定要在其中启动进程的SessionId 以及要启动的进程。如果要在远程服务器上启动,可选的是 servername。如果您在不带参数的情况下运行它,则会显示一个包含可能参数的对话框:

目前支持的操作系统版本是 Windows XP、2003、Vista 和 2008。

该程序需要在 Localsystem 用户的上下文中运行,因此它会临时将自身安装为服务并自行启动。使用WTSQueryUserToken,它获得所请求的终端会话的主要用户令牌。最后,进程使用CreateProcessAsUser 启动,服务会自行删除。

更多细节:

【讨论】:

  • 像个魅力!!
  • 此工具使用用户凭据在所需的会话中打开所需的程序,但您无法在普通用户的会话中以管理员权限打开它。
【解决方案3】:

这是一种 hack,但对我来说非常有用。在我的环境中比 psexec.exe 快得多。

只需在远程计算机上为特定用户或组创建一个临时任务,然后运行它,而不是删除该任务。

我为它创建了一个 powershell 脚本:

param (
    [string]$Computer = ($env:computername),
    [string]$User = "",    
    [string]$Command,
    [string]$Args
 )

$script_task = 
{

    param (
        [string]$User = "",
        [string]$Command,
        [string]$Args
     )

    #Action
    $Action = New-ScheduledTaskAction –Execute $Command
    if($Args.Length > 0) { $Action = New-ScheduledTaskAction –Execute $Command -Argument $Args}

    #Principal
    $P = New-ScheduledTaskPrincipal -UserId $User -LogonType Interactive -ErrorAction Ignore

    #Settings
    $S = New-ScheduledTaskSettingsSet -MultipleInstances Parallel -Hidden

    #Create TEMPTASK
    $TASK = New-ScheduledTask -Action $Action -Settings $S -Principal $P

    #Unregister old TEMPTASK
    Unregister-ScheduledTask -TaskName 'TEMPTASK' -ErrorAction Ignore -Confirm:$false

    #Register TEMPTASK
    Register-ScheduledTask -InputObject $TASK -TaskPath '\KD\' -TaskName 'TEMPTASK'

    #Execute TEMPTASK
    Get-ScheduledTask -TaskName 'TEMPTASK' -TaskPath '\KD\' | Start-ScheduledTask

    #Unregister TEMPTASK
    Unregister-ScheduledTask -TaskName 'TEMPTASK' -ErrorAction Ignore -Confirm:$false

}

#The scriptblock get the same parameters of the .ps1
Invoke-Command -ComputerName $Computer -ScriptBlock $script_task -ArgumentList $User, $Command, $Args

使用示例:

file.ps1 -User USER_NAME -Command notepad.exe -Computer REMOTE_COMPUTER

【讨论】:

  • 如果我尝试在自己的主机中打开它,它会说它不在受信任的主机中。您需要更改 powershell 运行策略。默认情况下它不允许运行文件。
【解决方案4】:

我不知道有什么方法可以控制另一个打开的 cmd 会话。但是,您应该可以使用runas 以其他用户身份运行它。

【讨论】:

    【解决方案5】:

    这可以使用 Microsoft 的 Sysinternals 工具存档。除了远程运行命令和脚本列表之外,它们对很多事情都很有用。作为管理员,他们多次成为我的救星。

    #To run a command on single computer remotly
    psexec \\RemoteComputerName Path_Of_Executable_On_Remote_Computer Argument_list
    
    #To run a command on list of computers remotely.
    psexec @Remote_Computer_list Path_Of_Executable_On_Remote_Computer Argument_list /AcceptEULA
    
    #To run list of commands on list of remote computer. make sure you copy batch file before you run command below.
    psexec @Remote_Computer_List Path_Of_Batch_On_Remote_Computer Argument_list
    

    【讨论】:

      猜你喜欢
      • 2018-02-04
      • 1970-01-01
      • 1970-01-01
      • 2022-08-21
      • 2021-11-20
      • 1970-01-01
      • 1970-01-01
      • 2021-06-10
      相关资源
      最近更新 更多