标签: powershell-remoting

如何在企业中使用PowerShell和PowerShell模块

最近,我加入了我的企业中的Windows团队和我的开发人员背景(Java,.NET和Web),我很快就对PowerShell感兴趣.我可以看到它对普通旧批处理文件VB的价值......这就是为什么我想推广它的用法,并且一点一点地推动人们支持它,除非有理由不这样做.

部署PowerShell似乎非常简单,因为我们可以轻松批准WSUS中的相关补丁,并通过GPO为AD集成服务器配置执行策略.

我的问题实际上更多是关于PowerShell和PowerShell模块的分发和使用(例如,PCSX,PowerShellPack,自制,......).

对于已经在企业中部署PowerShell的人:

  1. 您是否为PowerShell提供了某种标准软件包,并在每台服务器上部署了一组模块?如果这样做,那么如何部署已安装模块的新版本?

  2. 您是否已将中央PowerShell存储库放在存储所有PowerShell模块的位置?如果是这样,该存储库是全局可访问的,还是您同步的辅助存储库?

    我已经习惯了Maven,Ivy和其他依赖管理软件这样的工具,这就是为什么我对PowerShell在这方面提供的东西感到有点失望.

    我找到了一篇关于这个主题的非常好的文章,可能会走同一条道路,因为它符合我的要求.

  3. 你使用WinRM吗?您是直接从工作站连接还是有中央管理服务器?您是否限制对这些管理服务器的WinRM访问?

  4. 您是否在非托管环境(不在AD域中的服务器)中使用WinRM?你如何配置WinRM?

    我们有一个网络区域,其中服务器不属于AD域,因此我不能依赖WinRM的Kerberos身份验证.

  5. 在全球范围内,您的经验是什么,您对结果满意吗?

编辑: 关于问题2,我们决定建立一个中央存储库.

我们的想法是拥有一个将受版本控制(GIT)的主存储库,并且我们将成为唯一具有写访问权限的存储库.

从该存储库,我们将使用类似rsync的工具(在我们的情况下,将是robocopy)将模块复制到其他辅助存储库(这将是只读副本).客户端只能访问这些存储库(我们只需更新这些客户端上的PSModulePath以确保它们可以访问存储库).

我们还将发布我们的版本,因此在存储库中,将提供多个版本:开发,集成和生产.

powershell powershell-remoting

8
推荐指数
1
解决办法
3753
查看次数

PowerShell远程处理Win2008R2"WSMan服务无法启动主机进程来处理给定的请求"

我最近从2003年到2008年升级了许多服务器.自升级以来,我开始看到以下错误:

[servername]连接到远程服务器失败,并显示以下错误消息:WSMan服务无法启动主机进程来处理给定的请求.确保正确注册了WSMan提供程序主机服务器和代理.有关详细信息,请参阅about_Remote_Troubleshooting帮助主题.

错误似乎是随机的.该脚本将工作,然后失败.创建会话的命令处于循环中(创建会话,删除会话),并且作为一组部署脚本的一部分被多次调用.当脚本失败时,它会在不同的点失败.

我检查了本地工作站(win7)目标服务器(win2008R2)上的事件日志,但没有我能看到的错误.

这是随机失败的行:

$ session = New-PSSession -ComputerName $ serverName -Credential $ credential

我在Win2003上没有看到这个问题.脚本没有改变.我假设问题出在目标服​​务器上,但无法找到任何错误或日志来查看.它将工作一次然后失败,因此我的部署脚本有时会成功,然后在不同的点失败.

任何关于追踪这个问题的指导都将非常感激.

powershell powershell-2.0 windows-server-2008 powershell-remoting

8
推荐指数
1
解决办法
9982
查看次数

Powershell远程处理错误 - 找不到网络路径

我无法使用连接到远程服务器enter-pssession -computername serverA.我的情景:

  • 我在同一个域中有2个Win 2003 R2服务器.ServerA是WSUS服务器,serverB是域控制器
  • 两台服务器都启用了PowerShell远程处理
  • 两台服务器都配置了winrm(winrm quickconfig)
  • 两台服务器都将TrustedHosts设置为*
  • setspn.exe设置正确(http,https,wsman等)
  • 两台服务器都关闭了FireWall
  • 两台服务器都有PowerShell 2.0

我正在尝试enter-pssession -computername serverA从serverB到serverA的域管理员凭据,它会抛出以下错误:

""Enter-PSSession:连接到远程服务器失败,并显示以下错误消息:WinRM无法处理请求.使用Kerberos身份验证时出现以下错误:找不到网络路径.""

当我尝试enter-pssession -computername serverB从serverA的域管理员凭据下它工作正常!它也适用于我使用localhost所以:enter-pssession -computername localhost在域管理员凭据(在serverA上)也可以工作,但是当我在serverA(而不是localhost)上尝试主机名时,enter-pssession -computername serverA它会抛出相同的错误.

我也尝试使用get-credential并提供不同类型的凭据,但它没有帮助.唯一有帮助的是使用本地(非域)管理员帐户并运行enter-pssession -computername serverA -credentials $cred并且工作,但只在本地,我能够从本地机器(从serverA到自身)执行此操作,但不能从serverB到serverA下的serverA执行此操作管理员凭据.

有任何想法吗?

谢谢

powershell powershell-remoting

8
推荐指数
1
解决办法
2万
查看次数

如何在PowerShell远程处理会话的提示中为计算机名称添加颜色?

为了让我更加明显,当我远程连接到实时/生产服务器时,我认为在使用远程PowerShell会话时能够为我连接的机器名称着色是很方便的.

但是,我看不到这样做的方法......服务器名称前缀似乎独立于提示功能,即使我可以使用它,我也不确定如何定义新的提示会议的持续时间.

有没有办法定制这个?注意:我不想为所有服务器名称着色相同,我想区分本地/生产服务器.

powershell powershell-remoting powershell-3.0

8
推荐指数
1
解决办法
1489
查看次数

如何判断我是否处于远程PowerShell会话中?

我想执行特定于远程PSSession的代码.也就是说,代码不适用于本地,但适用于所有远程会话.

是否存在任何环境变量,函数或cmdlet,如果我处于活动的PSSession中,则会有效地返回true;如果我在本地运行,则会返回false?

powershell powershell-remoting

8
推荐指数
1
解决办法
1658
查看次数

Remote winrm上的"拒绝访问"

我使用winrm over SSL在Windows Azure上创建了一个Windows VM.

但是,我无法使用PowerShell脚本连接它.

当我运行以下内容时:

?Enter-PSSession -ConnectionUri https://myniceapp.cloudapp.net:5986 
                -Credential "hostname/username"  
                -SessionOption (New-PSSessionOption -SkipCACheck -SkipCNCheck)
Run Code Online (Sandbox Code Playgroud)

我正在收到提示输入密码的提示,输入后我设法连接.

但是,当我尝试自动化它时,它总是返回"访问被拒绝"

$securePassword = ConvertTo-SecureString -AsPlainText -Force "password"
$cred = New-Object System.Management.Automation.PSCredential "hostname/username", $securePassword 
?Enter-PSSession -ConnectionUri https://myniceapp.cloudapp.net:5986 -Credential $mycreds -SessionOption (New-PSSessionOption -SkipCACheck -SkipCNCheck)
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

编辑

完整错误如下所示:

Enter-PSSession:连接到远程服务器myniceaspp.cloudapp.net失败,并显示以下错误消息:访问被拒绝.有关详细信息,请参阅about_Remote_Troubleshooting帮助主题.

在行:1 char:1
+ Enter-PSSession -ConnectionUri https://myniceaspp.cloudapp ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~
+ CategoryInfo:InvalidArgument:(https:// myniceaspp ... udapp.net:5986/:Uri)[Enter-PSSession],PSRemotingTransportException
+ FullyQualifiedErrorId:CreateRemoteRunspaceFailed

powershell azure powershell-remoting winrm

8
推荐指数
1
解决办法
5万
查看次数

尝试远程访问localhost上的Exchange服务器时出现"访问被拒绝"错误

我正在尝试建立PowerShell会话以对localhost上的Exchange服务器运行多个Exchange命令.我一直收到以下错误:

New-PSSession : [<HOSTNAME>] Connecting to remote server <HOSTNAME> failed with the following error message
: Access is denied. For more information, see the about_Remote_Troubleshooting Help topic.
At line:1 char:12
+ $session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri 'h ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OpenError: (System.Manageme....RemoteRunspace:RemoteRunspace) [New-PSSession], PSRemotin
   gTransportException
    + FullyQualifiedErrorId : AccessDenied,PSSessionOpenFailed
Run Code Online (Sandbox Code Playgroud)

我的代码是Microsoft Technet文章的副本粘贴.它适用于远程机器,但无论何时我瞄准我运行的机器,我都会收到上述错误.

到目前为止我尝试过的:

  1. 检查了about_remote_troubleshooting帮助主题.与Access Denied错误相关的任何内容均无效.
  2. 使用与收到"拒绝访问"错误相同的凭据的目标远程计算机.(没有问题连接)
  3. 已验证我的PowerShell会话是以管理员身份运行的.(它是)
  4. 已验证Exchange命令行管理程序是否能够成功启动.(它是)
  5. 尝试没有凭据,看看是否可行.(它没有)
  6. 检查net usenet session确保我没有具有相同凭据问题的奇怪的多个连接.(我没有看到任何迹象表明)
  7. 从导致问题的脚本和手动键入命令到PowerShell控制台中尝试了这一点.(两种方式都得到了相同的结果.为了保持一致性)
  8. 在多个系统上尝试过这个.(到处都是相同的结果

一些快速说明:

  • 这是在Windows Server 2012上运行的Exchange 2013.它是一个基本安装,只是一个测试环境,除了安装和启用远程处理之外,它具有非常少的数据和最少的配置.
  • 使用的凭据用于域管理员,域管理员还具有必要的Exchange权限,可以执行我需要执行的任何操作.也就是说,只要我的目标机器不是我正在运行的机器,我就没有任何问题,没有其他任何改变我连接的方式.此外,这是一个测试域,其中域管理员的访问权限未受到任何限制或调整,因此它应该完全和完全访问所有内容. …

powershell access-denied powershell-remoting windows-server-2012 exchange-server-2013

8
推荐指数
1
解决办法
5万
查看次数

如何使用Invoke-Command将局部变量传递给在远程计算机上执行的脚本块?

我正在尝试检索位于远程服务器中的文件的Filehash Invoke-Command.我在powershell版本4上运行我的脚本.当我给出完整路径如下时,它工作正常:

Invoke-Command -ComputerName winserver -ScriptBlock { 
    Get-FileHash -Path E:\test\testfile.zip -Algorithm SHA1 
}
Run Code Online (Sandbox Code Playgroud)

以上命令有效.但是我需要通过变量传递文件名,如下所示:

Invoke-Command -ComputerName winserver -ScriptBlock { 
    Get-FileHash -Path "E:\test\$dest.zip" -Algorithm SHA1 
}
Run Code Online (Sandbox Code Playgroud)

我是脚本和PowerShell的新手.请帮我解决这个问题!

powershell powershell-remoting powershell-4.0

8
推荐指数
2
解决办法
1万
查看次数

从C#调用powershell脚本文件(example.ps1)

我尝试使用以下代码从C#运行脚本localwindows.ps1:

               PSCredential credential = new PSCredential(userName, securePassword);
                WSManConnectionInfo connectionInfo = new WSManConnectionInfo(false, "machineName", 5985, "/wsman", shellUri, credential);
                using (Runspace runspace = RunspaceFactory.CreateRunspace(connectionInfo))
                {

                    runspace.Open();
                    String file = "C:\\localwindows.ps1";
                    Pipeline pipeline = runspace.CreatePipeline();
                    pipeline.Commands.AddScript(file);
                    pipeline.Commands.Add("Out-String");
                    Collection<PSObject> results = pipeline.Invoke();
                }
Run Code Online (Sandbox Code Playgroud)

但是获得异常:'术语'C:\ localwindows.ps1'不被识别为cmdlet,函数,脚本文件或可操作程序的名称.

所以我尝试了以下方法:

PSCredential credential = new PSCredential(userName, securePassword);
WSManConnectionInfo connectionInfo = new WSManConnectionInfo(false, "machineName", 5985, "/wsman", shellUri, credential);
using (Runspace runspace = RunspaceFactory.CreateRunspace(connectionInfo))
{

    runspace.Open();

    using (PowerShell powershell = PowerShell.Create())
    {
        powershell.Runspace = runspace;           

        PSCommand new1 = new PSCommand();
        String …
Run Code Online (Sandbox Code Playgroud)

c# powershell powershell-remoting

7
推荐指数
1
解决办法
3万
查看次数

复制时拒绝访问

我已经实现了一个脚本,我试图将服务器A上的一些文件复制到服务器B.让我向您解释一下这个过程.

我启动了一个循环,它将运行两次,在第一次执行时,我停止应用程序池并启动应用程序池,而不是创建备份,而不是尝试复制文件但是它给了我一个错误,访问被拒绝但是我编辑该文件夹的所有权限,但通过脚本,它不允许我从服务器A复制和替换服务器2上的文件.

# Embedding the password in the script.
"Setting  Variables"
$MyDomain = "ranbi" ;
$MyClearTextUsername = "shian" ;
$MyClearTextPassword = "sham@01" ;
$MyUsernameDomain = $MyDomain + '\' + $MyClearTextUsername;
$SecurePassword = ConvertTo-SecureString -String $MyClearTextPassword -AsPlainText -Force ;
$MyCreds = New-Object System.Management.Automation.PSCredential $MyUsernameDomain,$SecurePassword ;

#System Variable for backup Procedure
$date = Get-Date -Format d-MMMM-yyyy-h-m-s                                                             #Variable is used to get the date and time

for ($i=1; $i -le 2; $i++) {
    $servername = "server" + $i
    $backupsrc = "\\$servername\C$\Program Files (x86)\service\healthService\v1_0" …
Run Code Online (Sandbox Code Playgroud)

powershell powershell-2.0 powershell-remoting powershell-3.0 powershell-4.0

7
推荐指数
1
解决办法
1162
查看次数