vbscript - 在ASP脚本中使用wscript.shell时无法引用UNC路径?

标签 vbscript permissions asp-classic wsh

我在使用wscript.shell对象通过ASP脚本从命令行执行命令时遇到问题。

这是我的代码:

inPath = server.mappath("/connect/dev_f_fusion3/video/6EA63679C27E48538D79F7C7295201CF/6EA63679C27E48538D79F7C7295201CF.mov")
outPath = server.mappath("/connect/dev_f_fusion3/video/6EA63679C27E48538D79F7C7295201CF\6EA63679C27E48538D79F7C7295201CF.flv"
outPath = "\\webdev2\SVC\streams\dev_f_fusion3\6EA63679C27E48538D79F7C7295201CF.flv"

dim cmd
dim wshell
dim wffm

cmd = """C:\Program Files\ffmpeg\ffmpeg.exe"" -i """ & inPath & """ -ar ""22050"" -ab ""32"" -f ""flv"" -s ""320x240"" """ & outPath & """"
set wshell  = server.createobject("wscript.shell")
set wffm = wshell.exec(cmd)

set wffm = nothing
set wshell = nothing


如您所见,我已经两次定义了变量outPath作为示例,以帮助您。在第一个outPath分配中,wscript.shell对象执行得很好,但是,在第二个outPath分配中,它失败了,这使我相信它与我指定为outPath的UNC路径有关。

是否不允许wscript.shell对象访问UNC路径?如果可以,我可以在哪里进行更改以允许他们使用?

谢谢您的帮助!

最佳答案

听起来这里有两个潜在的问题根源:
1.与启动新进程并让该进程访问UNC共享有关的问题
2.与权限相关的问题,无论是否使用新进程来访问UNC共享

我将从测试#2开始,首先检查您的站点是否可以在不启动新进程的情况下从远程共享读取文件。例如:

<%
dim filesys, filetxt
Const ForReading = 1, ForWriting = 2, ForAppending = 8 
Set filesys = CreateObject("Scripting.FileSystemObject")
Set filetxt = filesys.OpenTextFile("\\webdev2\SVC\streams\dev_f_fusion3\testfile.txt", ForReading, True) 
Response.Write (filetxt.ReadAll())
filetxt.Close 
%> 


如果失败,那么您的问题可能相对容易解决:您的网站无权访问远程共享。要修复,最简单的方法是使用匿名身份验证并选择有权访问共享的匿名用户。这是tutorial说明如何执行此操作。确保按照本教程的建议禁用集成的Windows身份验证!

另外,请确保您非常谨慎地处理和转义转换为EXE路径的用户输入,因为您确实不希望使恶意访问者能够在您的网络上运行任意代码!理想情况下,您永远不要直接根据用户输入创建已执行路径或命令行参数的任何部分,而只能间接地(例如,使用用户输入在数据库中查找已知安全的文件名,然后使用该数据库结果)在您的路径上)。

还有其他方法(域用户下的匿名身份验证除外)来启用远程访问,包括委派,使用基于HTTPS的基本身份验证等。如果您不能使用匿名身份验证,请与我详细联系,我可以帮助您确定找出正确的选择。

但是,如果上面的文件访问测试成功,那么您的问题就会更加复杂-这意味着IIS进程中运行的代码具有正确的访问权限,但是生成的进程不会继承访问远程资源的功能。

更新:根据下面的评论,您已经诊断出问题是在错误的用户帐户下启动了生成的进程。通过直接调用某些Win32 API可以解决此问题,并且还有.NET解决方案,但是除非您对VBScript感到满意,否则可能会超出现在想要的范围。

您能否将文件从远程计算机复制到本地计算机上的临时文件中,然后运行FFMPEG.EXE,然后(如果需要)将更改保存回远程服务器,最后删除该临时文件?

如果可以这样做,它将避免在该线程中描述的问题,可以更轻松地在ASP代码内捕获其他问题(例如,网络故障),而不是隐藏在FFMPEG.EXE内,甚至可以提高性能,具体取决于FFMPEG.EXE可以有效地处理远程文件访问。

这是一些用于将远程文件复制到临时本地位置的代码。警告,下面可能会有一些错别字,因为我将一些示例粘合在一起来创建它,而我自己却没有时间对其进行测试。

<%
dim filesys, filetxt
Const ForReading = 1, ForWriting = 2, ForAppending = 8 
Set filesys = CreateObject("Scripting.FileSystemObject")

Const TemporaryFolder = 2
Dim tfolder, tname, tfile
Set tfolder = fso.GetSpecialFolder(TemporaryFolder)
tname = tFolder & "/" & fso.GetTempName

Dim remoteFilename
remoteFilename = "\\webdev2\SVC\streams\dev_f_fusion3\testfile.txt"

Const OverwriteExisting = True
filesys.CopyFile  remoteFilename, tName, OverwriteExisting    
%> 


我相信这种本地复制方法将为您提供最佳的可靠性和最佳的性能,因为通过网络连接复制整个文件通常比一次读取一个块要快。如果大多数失败的操作(网络文件访问)发生在代码内部而不是别人的内部,那么错误处理和调试也将更加容易。

但是,如果您确信需要使用UNC访问权限来调用EXE,那么最好的选择是使用C ++,C#或VB构建COM组件,该组件将Wsh.Shell替换为进程启动器。我建议使用.NET语言而不是本机C ++构建组件,因为调用会容易得多。如果在.NET中执行此操作,则需要使用System.Diagnostics.Process类来启动您的进程,并使用ProcessStartInfo类来指定要使用的用户名/密码。

您也可以尝试使用WNetAddConnection2创建连接,然后使用CreateProcess或类似的Win32 API(或其等效的.NET)启动进程,但是您可能需要四处寻找合适的参数来使用。

换句话说,构建这个包装器是一个不难的问题。您最好的选择可能是当前的解决方法。

关于vbscript - 在ASP脚本中使用wscript.shell时无法引用UNC路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3284156/

相关文章:

vbscript - 在 VBScript 中检索 Cookie 和发送 Cookie 和发布变量

javascript - ASP 页面未运行 JavaScript/JQuery

permissions - 为什么在 onRequestPermissionsResult 之后调用 onResume?

permissions - 执行 gem 时出错...权限被拒绝

sqlite - 将 SQLite 与经典 ASP 结合使用

session - 在经典 asp 中,我可以在 Session 对象中存储数据库连接吗?

java - 如何通过vbscript运行java程序(jar文件)?

vbscript - 字符串不为 null、空或空字符串

vbscript - 删除超过特定期限的文件夹

javascript - 如何阻止特定 Sharepoint 页面的身份验证