本帖最后由 pusofalse 于 2011-10-17 18:40 编辑
不是BUG,理解错误。 @UserName表示的是当前线程所属的用户,在调用某些 模拟安全场景一类的系统函数之后,@UserName的值就会改变,变成模拟成功的用户的名称。测试以下代码便知,以下代码在模拟用户安全场景的过程中,输出的MsgBox对话框会有些卡,这是因为桌面没有开放 对指定用户读取桌面对象的权限。如果模拟用户之后,不涉及到与桌面进行交互的操作,完全可以把MsgBox改成ConsoleWrite一类的函数。
#include <lsasecur.au3>
MsgBox(0, "当前线程用户", "@UserName = " & @UserName)
If _SeIsUserAdmin() Then
; 模拟系统级安全场景
$hSystemToken = _SeImpersonateSystemContext( ProcessExists("lsass.exe"))
; 这里可以用 $hSystemToken 做某些事情,比如用它来创建一个系统级进程。
_SeCloseHandle($hSystemToken)
MsgBox(0, "模拟系统级安全场景", "@UserName = " & @UserName)
; 恢复模拟。
_SeRevertToSelf()
MsgBox(0, "恢复模拟", "@UserName = " & @UserName)
Local $sRandomName = String(Random(1000, 1000000, 1))
Local $sRandomPswd = String(Random(1000, 1000000, 1))
$sPrompt = StringFormat("是否创建一个账户名为 %s,密码为 %s 的本地用户,并模拟它的安全场景?", $sRandomName, $sRandomPswd)
If MsgBox(52, "确认", $sPrompt) = 6 Then
; 创建临时用户,用于测试模拟安全场景。
_SeCreateLocalUser($sRandomName, $sRandomPswd)
; 登录到 $sRandomName,并获取它的安全令牌。
$hUserToken = _SeLogonUser($sRandomName, $sRandomPswd, $SE_LOGON32_LOGON_INTERACTIVE)
; 模拟 $sRandomName 用户的安全场景。
_SeImpersonateLoggedOnUser($hUserToken)
; 这里可以用 $hUserToken 创建一个 $sRandomName 用户场景下的进程。
_SeCloseHandle($hUserToken)
MsgBox(0, "模拟 " & $sRandomName, "@Username = " & @UserName)
; 恢复模拟,@UserName 将恢复为原来的值。
_SeRevertToSelf()
; 删除临时测试用的本地用户。
_SeDeleteLocalUser($sRandomName)
EndIf
EndIf
; 枚举系统中的所有登录会话。
$aLogonSession = _SeEnumLogonSessions()
; __SeArrayDisplay($aLogonSession)
Local $sUserLogon
For $i = 1 To $aLogonSession[0][0]
If $aLogonSession[$i][7] = $SE_LOGON_TYPE_INTERACTIVE Then
$sUserLogon &= $aLogonSession[$i][0] & @CRLF
EndIf
Next
If Not _SeIsUserAdmin() Then
$sUserLogon &= @CRLF & "本进程不具管理员权限,以上用户可能有遗漏。"
EndIf
MsgBox(0, "当前已登录到桌面的用户", $sUserLogon)
|