4

如何在不同域的服务器之间传输文件?

i.e
PS C:\Users\Desktop> Import-Module bitstransfer
PS C:\Users\Desktop> $c=get-credential
PS C:\Users\Desktop> start-bitstransfer -Credential $c -source \\server\c$\test.txt -destination .

输出是:

Start-BitsTransfer : Cannot find path '\\server\c$\test.txt' because it does not exist.

我有权探索该服务器,但我不能使用 BitsTransfer。

它仅在我将 \server\c$ 安装为共享(即使用“net use”命令)时才有效,但我想避开它。

4

1 回答 1

5

根据我的发现,我认为问题在于 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\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 命令来自己手动建立连接。

于 2014-03-18T04:41:02.593 回答