我是PowerShell的初学者,并努力在不同网站的帮助下解决这个问题,我的要求和方案是
我安装了PowerShell的Windows Server 2008(rktdepy),我打包了带有.cmd
文件的应用程序。当我单击此.cmd
文件时,将部署该应用程序。
服务器名称为rktdepy
,我想创建一个PowerShell脚本,该脚本将连接到网络中的其他服务器(应从txt文件中获取服务器名称)并安装远程访问文件的应用程序来自rktdepy
服务器。这些文件不应该被复制到任何服务器,并且出于安全原因不应该使用psxec。
到目前为止,我已经使用了调用和映射网络驱动器,但仍然存在问题
$Comsession = Get-content c:\adminfiles\scripts\deploy.txt | new-pssession -throttlelimit 50
Invoke-command -computername RKTDEPLY54 -scriptblock { (new-object -comobject wscript.network).mapnetworkdrive("R:", "\\rktdepy\deploy", $true) }
Invoke-command -session $comsession -scriptblock {"CMD /C r:\QR_DEPLOY.CMD"}
以上脚本抛出错误,
我不想在脚本中使用任何密码,它应该从rktdepy
服务器获取当前登录的用户密码。如果脚本提示输入对所有服务器具有管理员访问权限的用户名和密码,我就可以了。
答案 0 :(得分:1)
看起来你正在处理几个问题。一个是当您运行使用映射驱动器的下一个Invoke-Command时,映射驱动器的会话已消失。您可以将其移动到相同的脚本块中以修复类似的问题。第二个是"第二跳"问题。查看Don Jones等资源。 PowerShell Remoting免费电子书http://powershell.org/wp/books的秘密。 史蒂夫
答案 1 :(得分:0)
我在我的机器上测试了以下内容,到目前为止它正在运行。您还可以尝试下面列出的另一种方法。
<强>方法一:强>
1.我的txt文件包含名为allcomputers.txt
的计算机列表。它包含每行上的机器名称。
Machine10
Machine20
Machine30
Machine40
部署脚本(mydeploytest.ps1
)接受Computername,用户名和密码作为输入并创建新的PSSession,然后调用命令。
PARAM(
[字符串] $计算机名,
[字符串] $用户,
[字符串] $通
)
Get-PSSEssion |删除-PSSession将
$ session = New-PSSession -ComputerName $ ComputerName
Invoke-Command -Session $ session -ScriptBlock {
参数(
[字符串] $计算机名,
[字符串] $用户名,
[字符串] $密码
)
$ net = new-object -ComObject WScript.Network
$ net.MapNetworkDrive(&#34; U:&#34;,&#34; \\ RKTDEPY \ deploy&#34;,$ false,$ Username,$ Password)
Invoke-Expression&#34; CMD / C U:\ deploy.cmd&#34;
$ net.RemoveNetworkDrive(&#34; U:&#34;)
-args $ ComputerName,$ User,$ pass
Get-PSSEssion |删除-PSSession
用于完成部署任务的Powershell命令行oneline。
PS C:&gt; Get-Content C:\ scripts \ allcomputers.txt | Foreach {C:\ scripts \ mydeploytest.ps1 $ _&#34; yourserviceaccount&#34; &#34;密码&#34;}
<强>方法2:强>
Invoke-Command的帮助方法有一个关于如何解决双跳问题的例子,答案中提到了stevals。
PS C:\> Enable-WSManCredSSP -Delegate Server02
PS C:\>Connect-WSMan Server02
PS C:\>Set-Item WSMan:\Server02*\Service\Auth\CredSSP -Value $true
PS C:\>$s = New-PSSession Server02
PS C:\>Invoke-Command -Session $s -ScriptBlock {Get-Item \\Net03\Scripts\LogFiles.ps1} -Authentication CredSSP
-Credential Domain01\Admin01
我认为通过对方法2的一点修改,您可以实现您想要的目标。