Vbscript 从ASP脚本使用wscript.shell时无法引用UNC路径?

Vbscript 从ASP脚本使用wscript.shell时无法引用UNC路径?,vbscript,permissions,asp-classic,wsh,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/6EA63679C27E48538D79F

我在使用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路径?如果是的话,我可以在哪里更改它,以便允许他们


谢谢你的帮助

假设您使用IIS 6,请查看这些链接


如果您发布了收到的具体错误,这将非常有用。此请求使用的身份验证类型是什么?如果您使用的是匿名,则需要使用域anon用户,或使用在目标服务器上具有相同用户名和密码的本地帐户

听起来有两个潜在的问题来源: 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 
%> 

如果这样做失败了,那么你的问题可能会相对简单地得到解决:你的网站无法访问远程共享。要解决此问题,最简单的方法是使用匿名身份验证并选择一个可以访问共享的匿名用户。这里有一个解释如何做到这一点。请确保按照教程的建议禁用集成windows身份验证

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

还有其他方法(域用户下的匿名身份验证除外)可以启用远程访问,包括委派、通过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    
%> 

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

<>但如果您确信调用UNE访问具有EXE的访问权限,您最好的选择是使用C++、C或VB来构建COM组件,它将WS.shell替换为进程启动程序。我将使用.NET语言来代替组件,而不是本地C++,因为调用会更容易。如果在.NET中执行此操作,则需要使用该类启动进程,使用该类指定要使用的用户名/密码

您也可以尝试使用创建连接,然后使用
CreateProcess
或类似的Win32 API(或其.NET等效程序)启动进程,但您可能需要反复尝试才能找到正确的参数来使用


换句话说,构建这个包装器是一个非常困难的问题。您的最佳选择可能是您当前的解决方案。

您是否检查过运行脚本的用户是否有权访问路径?@Tchami:是的,运行脚本的用户确实有权访问路径。谢谢您的回答。在IIS中创建虚拟目录并通过UNC路径指向另一台服务器没有问题当我尝试使用wscript.shell对象并将UNC路径作为命令行参数之一传入时,问题就出现了。我很确定这是wscript.shell对象或ffmpeg可执行文件无法访问UNC路径的权限问题。@Ryan,这一定是因为asp运行的帐户(通常是网络服务)非常有限(有充分的理由)。我找到的大多数答案都指向使用模拟。另外,请看一下:)(很抱歉,链接使您负担过重…)问题