[这最初是在 stackoverflow.com 上发布的,但在这里可能更合适,我确信这是服务器配置问题。如果这被认为是不好的形式,我们深表歉意。]
作为我们的数据库修订控制(和自动安装)过程的一部分,我们需要能够在 ASP 页面中对各种 .sql 文件运行 sqlcmd.exe。我用来执行此操作的代码是:
Dim cmd : cmd = "sqlcmd -S " & DATABASE_SERVER & " -U " & DATABASE_UID & " -P " & DATABASE_PWD & " -d " & DATABASE_NAME & " -i """ & scriptPath & """ -b"
Dim wshShell : Set wshShell = Server.CreateObject("WScript.Shell")
Dim return : return = wshShell.Run(cmd, 0, True)
我的代码在两台独立的开发机器上运行良好。它们都在运行 XP,不需要额外的步骤来使代码正常工作。将代码部署到 Windows 2003 服务器后出现问题。问题是 return 的值始终为 1。如果我尝试让它运行批处理文件或我能想到的任何其他东西,也会发生这种情况(如果我将 cmd 的值更改为不存在的文件,它就会爆炸正如我所料)
我尝试添加 I_USR 和 I_WAM 以对 sqlcmd.exe 和 cmd.exe 都具有执行权限,但它仍然返回 1。如果我在服务器上打开命令提示符并执行“runas /user:servername\i_usr sqlcmd.exe " 工作正常,但从 ASP 页面运行仍然无法正常工作。
此外,当手动运行 .sql 脚本时,一切都运行顺利,因此它们没有问题。
服务器上是否有任何我忘记在 IIS 或 Windows 中更改以使其正常工作的安全设置?
我也在另一台 Server 2003 机器上尝试过,并且遇到了完全相同的问题。
哈尔普。
刚刚发现问题所在(嗯,我的托管服务提供商做到了)。通过在命令前面添加“%COMSPEC% /C”(其中 %COMSPEC% 保存 cmd.exe 的路径)来更改代码。
它现在只是花花公子。我不确定为什么/如何,所以我暂时不回答这个问题,以便有人可以更全面地回答。