找回密码
 加入
搜索
查看: 1844|回复: 4

[AU3基础] @username 问题,bug还是理解错误

[复制链接]
发表于 2011-10-17 16:04:47 | 显示全部楼层 |阅读模式
写一个msgbox(0,"",@username),并编译为test.exe,
若登陆账号用户为a,运行test.exe,msgbox(0,"",@username),则显示为a;
若登陆账号用户为a,RunAs(“b”, @ComputerName, $sPassword, 0, test.exe, @SystemDir),msgbox(0,"",@username),则显示为b;

问题,请问,怎样写才能真正显示当前的登陆名??@username似乎手到运行它的身份的用户名限制,不能真正的反映出当前的登录名

谢谢大家,不知道哪位哥们告知调用dll,怎么写,多谢
 楼主| 发表于 2011-10-17 16:16:45 | 显示全部楼层
在论坛上搜索到gaoyuan22 的回答:
RegRead("Hkey_current_user\software\microsoft\windows\currentversion\explorer", "logon user name")
这种方法仅适用于winxp
 楼主| 发表于 2011-10-17 17:02:02 | 显示全部楼层
还想到一个思路:比较c:\users 下面,哪个文件名最新修改时间  即为最新的登陆名
发表于 2011-10-17 18:37:07 | 显示全部楼层
本帖最后由 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)
 楼主| 发表于 2011-10-17 19:12:26 | 显示全部楼层
感谢p老大的解释
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-9-20 23:25 , Processed in 0.076829 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表