从IIS(ASP)在服务器上运行VBS脚本

Sou*_*ery 4 vbscript asp-classic

我试图从服务器(IIS-6)上的ASP文件中运行VBS文件我已经更改了安全性,因此必须登录到服务器才能访问ASP页面(这样就可以让ASP获得权限了存储VBS文件的位置).

所以,我有一个如下所示的default.asp页面:

<%response.write "hello" 'just for debugging purposes.
set objshell = server.createobject("wscript.shell")
objShell.Run "c:\test\test.vbs",0,true '0=no interaction, true=wait for command to finish%>
Run Code Online (Sandbox Code Playgroud)

VBS文件只是一个空文件(一些备注)所以应该发生的是,wscript应该运行,什么也不做,关闭wscript.exe并返回它已完成.

在上面的示例中发生的是在服务器上wscript.exe启动,并且网页等待命令完成.但是wscript.exe永远不会退出/停止.如果我结束wscript.exe进程,那么页面将继续加载.但VBS不会被执行.

所以我尝试了一些修改,我在VBS文件中添加了代码来编写执行时的文件,所以我知道它不会运行VBS文件.

我还尝试了objshell.run/exec命令的其他变体:

objsshell.exec("cscript.exe /B /H:Cscript c:\test\test.vbs") ' nothing happens at all.
objsshell.exec("wscript.exe /B /H:Cscript c:\test\test.vbs") ' wscript and "hangs"
Run Code Online (Sandbox Code Playgroud)

任何人都有关于如何运行VBS命令以及退出Wscript.exe进程的任何提示?

Sou*_*ery 8

我想在经过几个小时的调整之后回答我自己的问题,因为我认为我的发现比我更有意思.

  1. 要查看正在进行的操作,请转到"万维网"服务的"与桌面交互"复选框.这样,所有错误和msgbox都显示在控制台上.

通过编写以下小的asp页面,我们得到了一个控制台/ cmd窗口,用于进行som测试:

<%
set objshell=server.createobject("WScript.Shell")
objshell.run "cmd.exe"
%>
Run Code Online (Sandbox Code Playgroud)

当您与"与桌面交互"一起执行此操作时,您将获得一个Commandline窗口,如果您在此窗口中写入

echo %userprofile%
Run Code Online (Sandbox Code Playgroud)

您将获得运行cmd窗口的用户.在我们的例子中,它是"默认用户".

  1. 在测试运行vbs脚本时,我们发现"默认用户"没有注册wscript.dll,我们也无法让它注册.我们从未陷入过原因.

  2. 但是,Cscript不需要注册,并且与桌面的交互也较少,因此可以阻止脚本的事情更少.我们还发现您需要对VBS文件中请求的所有文件执行FULL PATH(这可能是一个重大问题,因为我们使用了相对路径).

所以经过大量的摆弄,最终的ASP代码有效,等待VBS脚本做它的事情,然后继续加载页面是:

<%
set objshell=server.createobject("WScript.Shell")
objshell.run "cmd.exe /c ""cscript c:\test\test.vbs " + request("any_parameters") + " Another_hardcoded_parameter""",1,true
set objshell=nothing
response.redirect("/a_new_page_with_info_from_vbs_file.asp")
%>
Run Code Online (Sandbox Code Playgroud)

使用Windows集成身份验证或将具有这些文件访问权限的用户设置为可用的网站的匿名用户,但不是很安全.

  • 另一个补充。当我尝试使它在带有IIS 8服务器的Windows 2012 R2上运行时。要使其正常工作,如果您使用的是默认应用程序池,则需要添加文件夹/文件权限权限IIS APPPOOL \ DefaultAppPool;如果您在IIS中创建需要文件权限的新应用程序池,则需要为该池授予文件权限。在serverfault q / a中对此进行了全部解释:https://serverfault.com/questions/81165/how-to-assign-permissions-to-applicationpoolidentity-account (2认同)