function test-scriptblock {
1..10 }
function caller ([scriptblock]$runthis) {
& $runthis
}
Run Code Online (Sandbox Code Playgroud)
caller -runthis ${function:test-scriptblock}
Run Code Online (Sandbox Code Playgroud)
invoke-command -ComputerName localhost -ScriptBlock ${function:caller} -ArgumentList ${function:test-scriptblock}
Cannot process argument transformation on parameter 'runthis'. Cannot convert the "
1..10 " value of type "System.String" to type "System.Management.Automation.ScriptBlock".
+ CategoryInfo : InvalidData: (:) [], ParameterBindin...mationException
+ FullyQualifiedErrorId : ParameterArgumentTransformationError
Run Code Online (Sandbox Code Playgroud) 我把头发拉到这里,因为我似乎无法让它发挥作用,我无法弄清楚如何谷歌这个问题.我正在运行Powershell 2.0.这是我的脚本:
$computer_names = "server1,server2"
Write-Output "Invoke-Command -ComputerName $computer_names -ScriptBlock {
Get-WmiObject -Class Win32_LogicalDisk |
sort deviceid |
Format-Table -AutoSize deviceid, freespace
}"
Invoke-Command -ComputerName $computer_names -ScriptBlock {
Get-WmiObject -Class Win32_LogicalDisk |
sort deviceid |
Format-Table -AutoSize deviceid, freespace
}
Run Code Online (Sandbox Code Playgroud)
最后一个命令给出错误:
Invoke-Command : One or more computer names is not valid. If you are trying to
pass a Uri, use the -ConnectionUri parameter or pass Uri objects instead of
strings.
Run Code Online (Sandbox Code Playgroud)
但是当我将Write-Output命令的输出复制到shell并运行它时,它可以正常工作.如何将字符串变量转换为Invoke-Command将接受的内容?提前致谢!
我有这个:
(Get-WMIObject Win32_logicaldisk -computername computer).TotalPhysicalMemory
Run Code Online (Sandbox Code Playgroud)
获取远程计算机上安装的物理内存的大小.如何获得该计算机的免费内存?
我试过了
(Get-WMIObject Win32_logicaldisk -computername computer).FreePhysicalMemory
Run Code Online (Sandbox Code Playgroud)
和其他一些变种,但没有效果.是否有一些可能的"过滤器"列表?
我有一个可以本地或远程运行的脚本(通过WinRM),但我希望它在远程计算机上运行时的行为略有不同.我意识到我可以通过切换到脚本以确定它是在本地还是远程运行,但我想知道脚本本身是否有可能检测它是否正在远程运行?
我运行以下命令时遇到问题
$x = "c:\Scripts\Log3.ps1"
$remoteMachineName = "172.16.61.51"
Invoke-Command -ComputerName $remoteMachineName -ScriptBlock {& $x}
The expression after '&' in a pipeline element produced an invalid object. It must result in a command name, script
block or CommandInfo object.
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : BadExpression
+ PSComputerName : 172.16.61.51
Run Code Online (Sandbox Code Playgroud)
如果我不使用$x变量,则不会出现问题
Invoke-Command -ComputerName $remoteMachineName -ScriptBlock {& 'c:\scripts\log3.ps1'}
Directory: C:\scripts
Mode LastWriteTime Length Name PSComputerName
---- ------------- ------ ---- --------------
-a--- 7/25/2013 9:45 PM 0 new_file2.txt 172.16.61.51
Run Code Online (Sandbox Code Playgroud) 我正在尝试远程PowerShell从我的域加入PC到我们DMZ中的服务器,但我无法弄清楚如何让它工作.
DMZ服务器在启用的默认端口5985上配置了针对HTTP的侦听器.计算机中的两个NIC都标记为公共网络,因此我更改了公共配置文件的Windows远程管理(HTTP-In)防火墙规则,以接受来自我的IP以及已配置的本地子网的连接.
在我的客户端计算机(Windows 10)上,我将服务器的主机名添加到WSMan:\ localhost\Client\TrustedHosts,并将LocalAccountTokenFilterPolicy(值:1,类型:DWORD)添加到注册表.
我用服务器的本地凭据(servername\username)创建一个凭证对象然后我尝试$Sess = New-PSSession -ComputerName DMZCOMPUTER -Port 5985 -Credential $Cred连接总是尝试使用Kerberos连接到显然不起作用的机器.
如果我尝试,$Sess = New-PSSession -ComputerName DMZCOMPUTER -Port 5985 -Credential $Cred -Authentication Basic我会收到一个错误,即当前禁用了未加密的流量.其他认证方案产生不同的错误消息,但我从来没有能够远程.
我错过了某处的配置吗?使用远程PowerShell从域加入的客户端连接到工作组服务器所需的设置(服务器和客户端)是什么.
我有一个脚本可以打开到本地主机的远程会话。我需要这个来从登录脚本中在某些设备上安装 NuGet。
$Username = "Admin"
$Password = ConvertTo-SecureString ‘adminPW’ -AsPlainText -Force
$adminCredential = New-Object System.Management.Automation.PSCredential $Username, $Password
$Session = New-PSSession -Credential $adminCredential
Invoke-Command -Session $Session -ScriptBlock {Install-PackageProvider -Name NuGet -Verbose -MinimumVersion 2.8.5.201 -Force}
Run Code Online (Sandbox Code Playgroud)
每次我尝试运行它时,我都会收到以下错误:
New-PSSession : [localhost] 连接到远程服务器 localhost 失败并显示以下错误消息:客户端无法连接到目标
请求中指定。验证目标上的服务是否正在运行并且正在接受请求。查阅日志和文档以了解
在目标上运行的 WS-Management 服务,最常见的是 IIS 或 WinRM。如果目标是 WinRM 服务,请在
分析和配置 WinRM 服务的目标:“winrm quickconfig”。有关详细信息,请参阅 about_Remote_Troubleshooting 帮助主题。
在 C:\Users\Mike Holtackers\OneDrive - Foreign Trade Association\Scripts\OutlookSig\getAADconnectionOK.ps1:5 char:12
+ $Session = New-PSSession -ConnectionUri $ConnectionURI -Credential $a ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~
+ CategoryInfo : OpenError: (System.Manageme....RemoteRunspace:RemoteRunspace) … 我正在与 Jenkins 合作远程部署 PowerShell 脚本。因此,我试图弄清楚使用$PSScriptRootover$MyInvocation.MyCommand.Path获取当前脚本根目录是否会出现问题。
一位同事顺便告诉我,使用$PSScriptRoot远程功能是一个坏主意,因为我可能偶尔会发现它在运行时由于某种原因或其他原因没有返回预期值,即使它以前工作过。但是,无法解释为什么会这样。
在我的研究中,我没有发现任何可以进一步解释这一点或避免此类问题的最佳实践方法的任何内容。我主要发现这两者基本上可以互换;然而,$PSScriptRoot可以仅在PowerShell中V3或更高版本一起使用。通过你们中的一些人的帮助,我还了解到它$MyInvocation具有情境差异,可以根据范围和模块进行更改。但我仍然没有发现这是否或为什么会成为 PowerShell Remoting 的问题。
示例 001
所以我在 Jenkins 中有一个 PowerShell 脚本,它$PSScriptRoot用作查找我希望通过相对路径调用的脚本的手段。我是否能够依靠它来始终为所述脚本提供相同/预期的路径?
示例 002
使用由 Jenkins 启动的 PowerShell 脚本调用的 PowerShell 脚本,我是否能够期望$PSScriptRoot能够为我提供该脚本实际所在位置的路径,或者它会给我一个基于 Jenkins 的路径?
就我个人而言,我希望两者$PSScriptRoot都能为我提供正在运行的脚本的实际物理位置,而不是根据调用它的初始脚本更改的相对路径。
由于有了这种理解将帮助我节省大量时间和头痛,我希望像您这样的程序员可以帮助我了解这是否属实,以及为什么会发生这样的问题。
我想知道使用$PSScriptRoot是否会导致我在 PowerShell Remoting 中出现问题,从而使使用$MyInvocation更可行的选项?
我们正在尝试从远程服务器B上的serverA运行自动安装,该安装需要使用Windows身份验证与sql serverC进行通信。
Invoke-Command -ComputerName serverB -ScriptBlock {
$conn = new-object System.Data.SqlClient.SqlConnection 'Data Source=ServerC;Initial Catalog=master;Integrated Security=SSPI'
try
{
$conn.open()
} finally {
$conn | Remove-SQLConnection
}
} -Credential $cred
Run Code Online (Sandbox Code Playgroud)
但是,它无法返回:
”使用“ 0”参数调用“ Open”的异常:“用户'NT AUTHORITY \ ANONYMOUS LOGON'登录失败。”
我们使用以下方法解决了此问题:
Invoke-Command -ComputerName serverB -ScriptBlock { Register-PSSessionConfiguration -Name Ipswitch -RunAsCredential $using:cred -Force } -Credential $cred
Run Code Online (Sandbox Code Playgroud)
但是我们更喜欢使用受约束的kerberos委托:
我们尝试使用以下步骤执行kerberos委派:
##########################
#run on serverC
##########################
Add-WindowsFeature RSAT-AD-PowerShell
Import-Module ActiveDirectory
$serverB = Get-ADComputer serverB
$serverC = Get-ADComputer serverC
# Grant resource-based Kerberos constrained delegation
Set-ADComputer -Identity $serverC …Run Code Online (Sandbox Code Playgroud) sql-server powershell powershell-remoting kerberos-delegation
随着 powershell 7 的发布,似乎是时候超越 ps 5.1,所以我已经在几台服务器上安装了它来试一试。
但是,当我使用 ps7 从我的电脑创建到这些服务器的会话时,我总是在远程机器上运行 ps5.1。
Invoke-Command -ComputerName name -ScriptBlock {
Write-Host $env:COMPUTERNAME
$PSVersionTable.PsVersion
}
Run Code Online (Sandbox Code Playgroud)
输出 5.1.17763.316。任何想法如何让远程会话在默认情况下最好使用 7.0.0 版?
更新在 这方面取得了一些进展,所以尽管我会分享。
在 powershell 7 的远程机器上运行以下命令
Enable-PSRemoting
Run Code Online (Sandbox Code Playgroud)
这将创建一些 PsSessionConfigurations,您可以使用以下命令查看它们。
Get-PSSessionConfiguration
Run Code Online (Sandbox Code Playgroud)
现在您可以执行以下操作以从 powershell 7 创建会话
Invoke-Command -ComputerName ServerName -ScriptBlock { $PsVersionTable.PSVersion } -ConfigurationName Powershell.7
$session = New-PSSession ServerName -ConfigurationName Powershell.7
Invoke-Command -Session $session -ScriptBlock { $PsVersionTable.PSVersion }
Run Code Online (Sandbox Code Playgroud)
这现在在远程会话中使用 ps 7,快乐的日子。现在如何在默认情况下实现这一点......?从这个github 问题:
将默认的 microsoft.powershell 端点设置为他们选择的任何 PowerShell
我认为这就是我想要做的,因此切换回 ps 5.1 并尝试了以下命令:
Get-PSSessionConfiguration -Name microsoft.powershell | Set-PSSessionConfiguration -PSVersion 7.0 …Run Code Online (Sandbox Code Playgroud)