我试图通过向用户显示某种 gui 来使我们的软件部署更加用户友好,用户可以在其中获取一些信息并自己进行一些设置。我遇到的问题是充当 gui 的脚本(它是一个 HTA vbsctipt)是通过系统帐户执行的,因此不会直接显示给用户。相反,用户会收到消息“交互式服务检测”(由 Windows 7 上的 UIODetect 服务初始化)。单击该消息后,用户可以看到 gui。有没有办法直接向用户显示 gui?也许就像为用户创建一个任务,但比使用特权运行脚本(用户没有管理权限)?
3 回答
您遇到的问题是由于会话 0 隔离,会话 0 隔离是在 Vista 及更高版本中引入的。以下是网站的摘录:
http://technet.microsoft.com/en-us/library/ee449431(v=ws.10).aspx
会话 0 隔离。在 Windows XP 和更早版本的 Windows 中,所有服务都在与登录控制台的第一个用户相同的会话中运行。此会话称为会话 0。在会话 0 中同时运行服务和用户应用程序会带来安全风险,因为服务以提升的特权运行,因此是寻求提升自身特权级别的方法的恶意代理的目标。Windows Vista 和 Windows 7 操作系统通过隔离 Session 0 中的服务并使 Session 0 非交互来减轻这种安全风险。在这种情况下,只有系统进程和服务在会话 0 中运行。第一个用户登录到会话 1,后续用户登录到后续会话。
该网站可能有助于提供解决方案:
检查http://dieseyer.de/scr/elevate.hta
并使用
函数 HTAElevate()
在 WinXP 和 Win7 中 - 它工作正常
<html>
<head>
<title>HTA Helpomatic</title>
<HTA:APPLICATION
ID="oHTA"
APPLICATIONNAME="HTAHelpomatic"
SCROLL="yes"
SINGLEINSTANCE="yes"
>
<!-- ID="objHTAHelpomatic" -->
<!-- WINDOWSTATE="maximize" -->
</head>
<SCRIPT Language="VBScript">
If HTAElevate() = True Then
CreateObject("WScript.Shell").Run "mmc.exe compmgmt.msc", , True
Call Main()
End If
Sub Main()
MsgBox "HTA-Ende", 4096
End Sub
'*** v13.3 *** www.dieseyer.de *****************************
Function HTAElevate()
'***********************************************************
' http://dieseyer.de/scr/elevate.hta
' Unter Windows x64 laufen VBS' nach einem Doppelklick in der x64-Umgebung
' mit %WinDi%\System32\wscript.exe oder mit %WinDi%\System32\cscript.exe.
' In der x64-Umgebung laufen VBS aber nicht (richtig). Die Prozedur
' HTAElevate() erkennt dies und startet ggf. das VBS in der
Const Elev = " /elevated"
' MsgBox oHTA.commandLine, , "5016 :: "
' Trace32Log "5018 :: oHTA.commandLine: ==" & oHTA.commandLine & "==", 1
HTAElevate = True
' If InStr( LCase( oHTA.commandLine ), Elev) > 0 then MsgBox oHTA.commandLine, , "5022 :: "
If InStr( LCase( oHTA.commandLine ), Elev) > 0 then Exit Function
On Error Resume Next
window.resizeto 750, 10 ' : window.moveto screen.width / 2, screen.height / 2
On Error GoTo 0
' MsgBox oHTA.commandLine, , "5030 :: "
createobject("Shell.Application").ShellExecute "mshta.exe", oHTA.commandLine & Elev, "", "runas", 1
HTAElevate = False
self.close
End Function ' HTAElevate()
</SCRIPT>
<body>
</body>
</html>
PAExec是一个免费的、可再发行的和开源的,相当于微软流行的 PsExec 应用程序
例如,我有两个活动会话:
PS C:\> query session
SESSIONNAME USERNAME ID STATE TYPE DEVICE
services 0 Disc
>console Administrator 1 Active
rdp-tcp#3 administrator2 2 Active
rdp-tcp 65536 Listen
在会话 2 上打开计算器:
PS C:\> paexec.exe -i 2 -s C:\Windows\System32\calc.exe
-s
从会话 0 运行时,可能不需要该参数。