加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

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

发布时间:2020-12-16 09:58:19 所属栏目:asp.Net 来源:网络整理
导读:我在使用wscript. shell对象通过ASP脚本从命令行执行命令时遇到问题. 这是我的代码: inPath = server.mappath("/connect/dev_f_fusion3/video/6EA63679C27E48538D79F7C7295201CF/6EA63679C27E48538D79F7C7295201CF.mov")outPath = server.mappath("/connect
我在使用wscript. shell对象通过ASP脚本从命令行执行命令时遇到问题.

这是我的代码:

inPath = server.mappath("/connect/dev_f_fusion3/video/6EA63679C27E48538D79F7C7295201CF/6EA63679C27E48538D79F7C7295201CF.mov")
outPath = server.mappath("/connect/dev_f_fusion3/video/6EA63679C27E48538D79F7C7295201CF6EA63679C27E48538D79F7C7295201CF.flv"
outPath = "webdev2SVCstreamsdev_f_fusion36EA63679C27E48538D79F7C7295201CF.flv"

dim cmd
dim wshell
dim wffm

cmd = """C:Program Filesffmpegffmpeg.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("webdev2SVCstreamsdev_f_fusion3testfile.txt",ForReading,True) 
Response.Write (filetxt.ReadAll())
filetxt.Close 
%>

如果此操作失败,那么您的问题可能相对简单易于解决:您的网站无法访问远程共享.要解决此问题,最简单的方法是使用匿名身份验证并选择可以访问共享的匿名用户.这是一个tutorial解释如何做到这一点.确保禁用集成的Windows身份验证,如教程所建议的那样!

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

还有其他方法(除了域用户下的匿名身份验证)启用远程访问,包括委派,使用基本身份验证通过HTTPS等.如果您不能使用匿名身份验证,请告诉我更多详细信息,我可以帮助您选择正确的选择.

但是,如果上面的文件访问测试成功,则问题会更复杂 – 这意味着在IIS进程内运行的代码具有正确的访问权限,但生成的进程不会继承访问远程资源的能力.

更新:根据您在下面的评论,您已经诊断出问题是生成的进程是在错误的用户帐户下启动的.这可以通过直接调用一些Win32 API来解决,而且还有.NET解决方案,但除非你在VBScript之外感到舒服,否则你可能会比现在更多.

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

如果你能做到这一点,它将避免这个线程中描述的问题,将更容易捕获你的ASP代码中的其他问题(例如网络故障),而不是隐藏在FFMPEG.EXE内,它甚至可以提高性能取决于如何有效的FFMPEG.EXE处理远程文件访问.

以下是将远程文件复制到临时本地位置的一些代码.警告,下面可能会有一些拼写错误,因为我将几个样本粘在一起创建它并且没有时间自己测试它.

<%
dim filesys,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 = "webdev2SVCstreamsdev_f_fusion3testfile.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)启动您的进程,但您可能需要四处寻找要使用的正确参数.

换句话说,构建这个包装器是一个非常简单的难题.您最好的选择可能是您当前的解决方法.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读