我有一个客户端和一个服务器。客户端将调用如下脚本:
#Predefine necessary information
$Username = "Niels"
$Password = "password"
$ComputerName = "192.168.1.51"
$Script = {powershell c:/build/jclbuild2.bat}
#Create credential object
$SecurePassWord = ConvertTo-SecureString -AsPlainText $Password -Force
$Cred = New-Object -TypeName "System.Management.Automation.PSCredential" -ArgumentList $Username, $SecurePassWord
#Create session object with this
$Session = New-PSSession -ComputerName $ComputerName -credential $Cred
#Invoke-Command
$Job = Invoke-Command -Session $Session -Scriptblock $Script
echo $Job
#Close Session
Remove-PSSession -Session $Session
在服务器上jclbuild2.bat
将运行并访问\\otherserver\something
之类的网络驱动器,如果我执行此命令,则表示拒绝访问:
cmd.exe /C copy "\\server\file1.pdf" "\\server2\file1.pdf"
如何从远程服务器上的powershell文件访问网络驱动器?我使用$ username和$ password的用户应该可以访问网络驱动器。
我认为这是一个双跳问题,我不知道如何解决。
答案 0 :(得分:2)
您无法使用默认身份验证机制执行此操作。您需要使用允许流式传输凭据的身份验证机制,而不仅仅是身份。 Kerberos就是其中之一。 CredSSP是从Vista / Server 2008开始构建到Windows的另一个版本。
我有设置CredSSP的经验。请注意,存在一些安全风险,因为目标计算机可以以纯文本格式访问凭据。
要进行设置,您需要运行两个命令(均来自提升的shell)。一台在机器上运行上述脚本(客户端),另一台在目标上,您将通过远程处理(服务器)连接。
Enable-WSManCredSSP -Role Client -DelegateComputer $ComputerName -Force
这允许从客户端委派$ ComputerName(注意您可能必须使用FQDN)。出于安全原因,您应该避免使用通配符'*'
,尽管您可以考虑使用'*.mydomain.int'
来启用对域中所有计算机的委派。
在目标服务器上
Enable-WSManCredSSP -Role Server
然后在创建会话时使用-Authentication标志
$Session = New-PSSession -ComputerName $ComputerName -credential $Cred -Authentication Credssp
ServerFault关于设置CredSSP的问题。还有一篇博文here,附加说明。这个post包含一些常见错误消息的疑难解答提示。
答案 1 :(得分:0)
另一种选择是在服务器上使用委派会话。
基本上,您创建一个自定义远程会话,该会话使用-RunAs参数来指定会话将在其下运行的凭据。您还可以限制可在会话中运行的脚本和cmdlet,并指定可以连接到会话的人员。
在这种情况下,会话将作为Niels帐户运行,并且会话中完成的所有内容都将在该帐户权限下,无论谁连接到会话。从该会话中,您现在可以在不需要CredSSP的情况下跳转到另一台服务器。
这也消除了将该帐户密码存储在客户端计算机上的脚本文件中所涉及的安全风险。