P /在PSSession期间调用

时间:2013-12-05 04:11:51

标签: powershell pinvoke

由于某种原因,通过PSSession的P / Invoke无效。我有一个客户端脚本,我从服务器通过PSSession运行。这是客户端脚本的代码:

$signature = @"
  [DllImport("user32.dll")]
  public static extern bool BlockInput(bool fBlockIt);
"@

$block = Add-Type -MemberDefinition $signature -Name DisableInput -Namespace DisableInput -PassThru
$unblock = Add-Type -MemberDefinition $signature -Name EnableInput -Namespace EnableInput -PassThru

$block::BlockInput($true)
Start-Sleep -Seconds 10
$unblock::BlockInput($false)

我基本上测试阻止/解锁键盘和鼠标访问,基于我发现的here演练。我可以成功运行脚本,而我运行的帐户应该具有提升的权限,但出于某种原因,对$block::BlockInput$unblock::BlockInput的调用都返回False ,键盘和鼠标都没有被阻挡。

当我在客户端计算机上直接使用相同的帐户运行完全相同的脚本时,脚本完全按照应有的方式执行操作 - 锁定键盘和鼠标10秒钟,并且两次调用BlockInput都返回{{1 }}。我究竟做错了什么?是否可以通过PSSession进行P / Invoke?

2 个答案:

答案 0 :(得分:4)

我的解释:据我所知,当您在PSSession中运行远程脚本时,它在工作区中执行,完全独立于用户。例如,如果您启动记事本,您可以看到记事本在远程计算机上执行,但您无法在UI上看到它。您的脚本会阻止PSSession工作区的控制台键盘,但不会阻止用户的控制台键盘。


更多解释:

下图显示了Windows Vista和最新版本中的会话,Windows工作站,桌面和服务之间的关系。在Windows Vista中开始会话0是服务运行的基本会话,控制台会话通常是会话1。

enter image description here

当您用作PSSession时,会创建一个远程进程WSMPROVHST.EXE。正如您在下面的捕获中所看到的,此过程在会话0中运行,您的用户与会话1进行交互。

enter image description here

Sessions, Desktops and Windows Stations博客中,您会找到完整的解释。

答案 1 :(得分:0)

使用以下代码:

代码从这里开始

$signature = @"
[DllImport("user32.dll")]
public static extern bool BlockInput(bool fBlockIt);
"@
$BlockInput = Add-Type -memberDefinition $signature -name Win32BlockInput -namespace     Win32Functions -passThru

function Enable-BlockInput { $null = $BlockInput::BlockInput($true) }
function Disable-BlockInput{ $null = $BlockInput::BlockInput($false)}

直到此部分是定义部分,您可以在单独的.PS1文件中或在以下代码之前定义。

以下是阻止输入的命令

Enable-BlockInput

以下是发布输入的命令

Disable-BlockInput

它对我有用...希望对你也有用,祝你好运