我在 Windows Server 2008 R2 上运行了一个服务,该服务需要访问 webdav 映射驱动器,以复制文件依赖项。当我从命令提示符运行 net use 时,一切正常:
净使用量 z:https://domain.com/webdav/用户:此用户密码
或者从命令提示符运行我的脚本,一个 ant 构建脚本:
<target name="mapdrive.developer" depends="checkmappeddrive" unless="mapped.drive.present">
<antcall target="disconnect.mapped.drive" />
<echo message="Mapping drive..." />
<exec executable="net">
<arg value="use" />
<arg value="z:" />
<arg value="https://test.com/plugins/servlet/confluence/default" />
<arg value="/PERSISTENT:YES" />
<arg value="/USER:xxxxx" />
<arg value="xxxxx" />
</exec>
</target>
是的,这是一个 SSL/HTTPS webdav 映射。我知道注册表中的系统设置,并且安装了 WebClient“桌面体验”。登录并从命令提示符运行时,一切都正常工作。但是,如果我使用此脚本并从以本地系统帐户运行的构建服务中生成脚本,则命令会失败并显示错误:“发生了系统错误 67。”。我尝试启用“允许服务与桌面交互”并将“以...身份登录”设置更改为普通用户。两者都不起作用。我搜索并发现类似的问题,人们成功将驱动器映射为用户,但从脚本作为服务(本地系统帐户)运行时失败。我找不到解决方法,如果有的话。
这里有谁能找到解决这个问题的办法吗?如能提供任何信息,我将不胜感激。
答案1
搞定了。您必须使用 UNC 路径从远程源复制并作为本地服务运行。显然,这个问题在堆栈溢出:
从http://msdn.microsoft.com/en-us/library/ms685143.aspx:
必须访问远程资源的服务(或在不同安全上下文中运行的任何进程)应使用通用命名约定 (UNC) 名称来访问资源。服务必须具有适当的权限才能访问资源。如果服务器端服务使用 RPC 连接,则必须在远程服务器上启用委派。
驱动器号不是系统全局的。每个登录会话都会收到一组从 A 到 Z 的驱动器号。因此,重定向的驱动器不能在不同用户帐户下运行的进程之间共享。此外,服务(或在其自己的登录会话中运行的任何进程)无法访问在不同登录会话中建立的驱动器号。
服务不应通过映射驱动器号直接访问本地或网络资源,也不应在运行时调用 net use 命令来映射驱动器号。
驱动器号不起作用。因此,如果您正在复制来自 wedav/https 的文件,并且启用了 SSL,则必须使用 UNC 映射源:
净使用https://test.net/plugins/servlet/confluence/default/用户:用户密码
然后,当您执行“net use”时,您将看到以下内容:
C:\Users\Administrator\test>net use
New connections will be remembered.
Status Local Remote Network
-------------------------------------------------------------------------------
\\test.net@SSL\plugins\servlet\conf
luence\default
Web Client Network
The command completed successfully.
我使用 robo copy 从 UNC 复制:
robocopy \\test.ney@SSL\plugins\servlet\confluence\default . /z /e