根据我的发现,我认为问题在于 BitsTransfer 的工作方式。它只能以交互方式工作(即作为登录和活动用户)。来自微软的文档:
从在非交互式上下文(例如 Windows 服务)中运行的进程中使用 *-BitsTransfer cmdlet 时,您可能无法将文件添加到 BITS 作业,这可能会导致挂起状态。要使作业继续进行,必须登录用于创建传输作业的身份。例如,在作为任务计划程序作业执行的 PowerShell 脚本中创建 BITS 作业时,除非启用了任务计划程序的任务设置“仅在用户登录时运行”,否则 BITS 传输将永远不会完成。-使用 Windows PowerShell 创建 BITS 传输作业
在我做了一些测试之后,这意味着问题不在于跨域身份验证(我假设您有正确的信任等工作),而在于 Bits 使用登录名进行身份验证。
因此,我们遇到了以下类型的问题(使用无权访问的 contoso\user 和有访问权的 contoso/admin)并指定凭据参数:
- 以 contoso\user 身份登录,凭据 = contoso\user,Start-BitsTransfer = 错误:找不到路径
- 以 contoso\user 身份登录,凭据 = contoso\admin,Start-BitsTransfer = 错误:找不到路径
- 这是您收到的错误消息。基本上它没有按预期使用 Credential 参数。
- 以 contoso\admin 身份登录,凭据 = contoso\admin,Start-BitsTransfer = 成功。
- 以 contoso\admin 身份登录,凭据 = contoso\user,Start-BitsTransfer = 成功。
- 真的被这个搞糊涂了,竟然查了安全日志,果然EventID 4624,它是用当前登录的用户contoso\admin登录远程机器访问文件,而不是凭据参数。
现在尝试一些 runas 解决方法。以 contoso\user 身份登录时:
runas /user:contoso\admin powershell.exe
运行 Start-BitsTransfer =Error: Start-BitsTransfer : The operation being requested was not performed because the user has not logged on to the network. The specified service does not exist. (Exception from HRESULT: 0x800704DD)
- 这是非常出乎意料的。即使尝试了
-Credential
相同的结果。执行 runas 就像您以其他用户身份登录一样,但我想您可能需要一个配置文件......让我们接下来尝试一下。
runas /profile /user:contoso\admin powershell.exe
运行 Start-BitsTransfer =Error: Start-BitsTransfer : The operation being requested was not performed because the user has not logged on to the network. The specified service does not exist. (Exception from HRESULT: 0x800704DD)
- 这也是出乎意料的......没有办法运行运行......但是还有一个运行参数 - netonly:
runas /netonly /user:contoso\admin powershell.exe
运行 Start-BitsTransfer =Error: Start-BitsTransfer : Access is denied.
- 这可能是最令人惊讶的,因为它实际上给了我们不同的错误信息。
最后,解决方法。跑了以下:
$c = Get-Credential -UserName 'consoso\admin'
net use \\server\c$
Start-BitsTransfer -Credential $c -source \\server\c$\test.txt -destination .
#Success
net use \\server\c$ /delete
#Error: Cannot find path
(当然使用 contoso\admin 作为 net use 命令)
原因是 net use 命令实际上将您登录到服务器上。一旦您拥有该 kerberos 票证,它就可以工作,因为它已经缓存了管理员凭据,并使用这些凭据来访问文件。有关类似的解决方案,请参阅:具有备用凭据的复制项
基本上,Bits 传输似乎存在错误,并且它没有-Credential
按预期处理该属性。相反,它似乎总是默认使用当前登录的用户进行身份验证,除了您手动执行 net use 命令来自己手动建立连接。