关于domain user用户执行admin权限安装-AutoIt(RunAs)


身边有同事、朋友,还有一些网友给我留言:关于domain user用户如何通过另一个管理员权限用户来执行程序安装。。。。

暂不管需要安装的程序是什么,先不妨试试我写的一段测试用的脚本示例:

#cs
Au3 版本: v3.3.9.21 (Beta)
脚本作者:boyhong
技术介绍: http://boyhong.blog.51cto.com
#ce
#NoTrayIcon
;自行修改以下信息为你实际信息
Local $sUserName = "autosetupsoftware"
Local $sPassword = "abc123#"
Local $DOMAIN="tdomain.cn"
If IsAdmin() Then
Local $ADMIN="当前管理员权限运行"
Else
Local $ADMIN="当前非管理员权限运行"
EndIf
Local $pid = RunAs($sUserName, $DOMAIN, $sPassword, 0, @WindowsDir&"\regedit.exe")
;说明:若返回值为0,请确认:1:这个user的信息是否确认?2:当前是否保持了域网络连接.
MsgBox(262144+0,$ADMIN,"返回值:"&$pid)


当然:若测试想基于本地管理员组的话,只需修改:

#cs
Au3 版本: v3.3.9.21 (Beta)
脚本作者:boyhong
技术介绍: http://boyhong.blog.51cto.com
#ce
#NoTrayIcon
;自行修改以下信息为你实际信息
Local $sUserName = "autosetupsoftware"
Local $sPassword = "abc123#"
If IsAdmin() Then
Local $ADMIN="当前管理员权限运行"
Else
Local $ADMIN="当前非管理员权限运行"
EndIf
Local $pid = RunAs($sUserName, @ComputerName, $sPassword, 0,  @WindowsDir&"\regedit.exe")
;说明:若返回值为0,请确认:1:这个user的信息是否确认?2:当前是否保持了域网络连接.
MsgBox(262144+0,$ADMIN,"返回值:"&$pid)

请保证通过这个测试(通过测试的表现如以上脚本所示,返回值非0,并且打开注册表),然后的然后,就没有然后了。。。。。


那么,为什么这么说呢?我的理解是:

1.若通过了这个测试,表明:$sUserName 指定的用户名及相关密码,域这几个基本信息填写正确,防有马大哈出现;

2.可以确定通过domain user普通用户使用其它本地管理员组或者直接域管理员来运行任意程序。

3.在此测试基础上修改成生产应用环境就易而反掌了。


那么,在实际生产环境中,依然有一些程序安装使用如此方法不可行,那会有哪些可能呢?返回仔细看:

RunAs ( "用户名", "域", "密码", 注册标志, "程序" [, "工作目录" [, 显示标志 [, 选项标志 ]]] )

其中第四个参数:

0 - 不加载配置文件的交互式登录.
1 - 加载配置文件的交互式登录.
2 - 使用网络证书.
4 - 继承调用进程的环境, 而不是用户环境.

可能在一些实际生产环境中得使用加载配置文件的交互式登录.

若你有更好的想法可以分享一下,在此感谢。

2014.4.5更新:

有朋友QQ问我如何运行自身呢?这样可以单一文件搞定...其实Autoit有个宏:@AutoItExe,示例代码如下:

#cs
    Au3 版本: v3.3.9.21 (Beta)
    脚本作者:boyhong
    技术介绍: http://boyhong.blog.51cto.com
#ce
;自行修改以下信息为你实际信息
Local $sUserName = "autosetupsoftware"
Local $sPassword = "abc123#"
Local $DOMAIN = "tdomain.cn"
If IsAdmin() Then
    Local $ADMIN = "当前管理员权限运行"
    Exit
Else
    Local $ADMIN = "当前非管理员权限运行"
    Local $pid = RunAs($sUserName, $DOMAIN, $sPassword, 0, @AutoItExe)
    ;说明:若返回值为0,请确认:1:这个user的信息是否确认?2:当前是否保持了域网络连接.
    MsgBox(262144 + 0, $ADMIN, "返回值:" & $pid)
EndIf