由于某种原因,通过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?
答案 0 :(得分:4)
我的解释:据我所知,当您在PSSession中运行远程脚本时,它在工作区中执行,完全独立于用户。例如,如果您启动记事本,您可以看到记事本在远程计算机上执行,但您无法在UI上看到它。您的脚本会阻止PSSession工作区的控制台键盘,但不会阻止用户的控制台键盘。
更多解释:
下图显示了Windows Vista和最新版本中的会话,Windows工作站,桌面和服务之间的关系。在Windows Vista中开始会话0是服务运行的基本会话,控制台会话通常是会话1。
当您用作PSSession时,会创建一个远程进程WSMPROVHST.EXE。正如您在下面的捕获中所看到的,此过程在会话0中运行,您的用户与会话1进行交互。
在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
它对我有用...希望对你也有用,祝你好运