背景
\n\n我有一个 .NET 应用程序,我想将其安装在 Nano Server Docker 容器内,特别是构建 1809。该应用程序基本上是一个 REST 服务器,它将接收 REST 请求,并根据 JSON 的内容调用特定的 PowerShell cmdlet在特定的远程系统上并以 JSON 格式返回结果。
\n\n我能够创建一个安装了 PowerShell 和 .NET Core 的 Nano Server Docker 容器。然而,我最终意识到容器上没有安装 WinRM,因此无法调用远程 PowerShell cmdlet。
\n\n我的主机系统是 Windows Server 2019 Datacenter,版本 1809(操作系统内部版本 17763.379)。我正在使用适用于 Windows 的 Docker Desktop(版本 2.0.0.3)并启用了 Windows 容器。
\n\nDockerfile
\n\n这是我正在使用的 Dockerfile。我通过结合此处和此处的部分 Dockerfile 创建了它。
\n\n# escape=`\n# Args used by from statements must be defined here:\nARG fromTag=1809\nARG InstallerVersion=nanoserver\nARG InstallerRepo=mcr.microsoft.com/powershell\nARG NanoServerRepo=mcr.microsoft.com/windows/nanoserver\n\n# Use server core as …Run Code Online (Sandbox Code Playgroud) powershell powershell-remoting docker dockerfile nano-server
我在其中一台启用了 ssh 的工作站上运行 Windows 10 Pro。我能够成功地从我的 Mac ssh 到 Windows,但是当我尝试命令 New-PSSession -HostName xxxx -UserName yyyy 时,我在输入密码后收到以下消息:后台进程报告了以下消息的错误:SSH 客户端会话以错误消息结束:子系统请求在通道 0 上失败。
我正在尝试使用 powershell 在文件末尾添加多行。例如:该文件已经存在并且其中包含一些内容。
abc.txt
abc
def
ghi
jkl
mno
pqr
Run Code Online (Sandbox Code Playgroud)
所以 abc.txt 文件看起来就像我上面提到的那样。现在我尝试在文件末尾和新行添加以下内容。
qwe
asd
zxc
vbn
Run Code Online (Sandbox Code Playgroud)
最终输出将是 - abc.txt
abc
def
ghi
jkl
mno
pqr
qwe
asd
zxc
vbn
Run Code Online (Sandbox Code Playgroud)
由于我是一名新手,我尝试在已成功执行的文件中添加一行,但不知道添加多行。
Add-Content "./sample3.txt" "This is the last line `n"
Run Code Online (Sandbox Code Playgroud) powershell powershell-remoting powershell-3.0 powershell-core
如果我从solaris服务器ssh到美国服务器,ssh连接速度非常快,例如删除文件很快就能完成.
但是为什么PowerShell远程处理如此慢,在我进入远程会话后,然后删除一个项目,完成需要10秒以上.
Enter-PSSession -computerName test
remove-item 'C:\20010101.xls'
Run Code Online (Sandbox Code Playgroud)
运行以下命令也需要5秒以上.
[Environment]::UserDomainName + "\" + [Environment]::UserName+" on"+[Environment]::MachineName
Run Code Online (Sandbox Code Playgroud)
我使用远程处理的原因之一是远程桌面连接速度很慢,因为它必须将大量数据从服务器传输到本地.对于远程处理,我希望它只传输非常少量数据的文本,所以我希望它比远程桌面连接快得多.但事实是它也很慢.
有什么方法可以提高性能,或者找出大部分时间的用途?
我有一个脚本从vmm获取虚拟硬盘信息,我从服务器远程执行它,目前我无法获取本地主机中的pssession之外的变量值,请你帮我实现同样的目标.
PS C:\Windows\system32> enter-pssession iscvmm02
[iscvmm02]: PS C:\Users\su\Documents>Add-PSSnapin Microsoft.SystemCenter.VirtualMachineManager
[iscvmm02]: PS C:\Users\su\Documents>$hide= Get-VMMServer -ComputerName "iscvmm02.corp.avanade.org"
[iscvmm02]: PS C:\Users\su\Documents>$VM = Get-VM | where { $_.ComputerNameString -contains "idpsm02.corp.air.org" }
[iscvmm02]: PS C:\Users\su\Documents>$harddisk=$VM.VirtualHardDisks
[iscvmm02]: PS C:\Users\su\Documents>$h=$harddisk.length
[iscvmm02]: PS C:\Users\su\Documents>for($i=0;$i-lt$h;$i++){
New-Variable -Name "HardDiskType_$i" -value $harddisk[$i].vhdtype
New-Variable -Name "HardDiskLocation_$i" -value $harddisk[$i].Location
}
[iadpscvmm02]: PS C:\Users\su\Documents>Exit-PSSession
PS C:\Windows\system32>$harddisktype_0
PS C:\Windows\system32>$harddisklocation_0
Run Code Online (Sandbox Code Playgroud)
因为你可以看到变量输出给出null值,我无法保留值
我在PSObject使用定义的NoteProperties 访问s时遇到了困难,这些会被传递到远程会话Invoke-Command.我为此目的构造一个对象的原因是我需要在远程会话中访问两个单独的信息,但PowerShell只提供一个InputObject.
我的代码看起来像这样:
$sessionInput = new-object -TypeName System.Object
$sessionInput | Add-Member -MemberType NoteProperty -Name NoteProperty1 -Value @("some", "value")
$sessionInput | Add-Member -MemberType NoteProperty -Name NoteProperty2 -Value @("some", "other", "value)
$session = New-PSSession -ComputerName my-computer -Credential (Get-Credential)
Invoke-Command -Session $session -InputObject $sessionInput {
$input #1
$input | Get-Member #2
$input.NoteProperty1 #3
$input.NoteProperty1 | Get-Member #4
}
Run Code Online (Sandbox Code Playgroud)
我为上面的每个编号行得到以下输出.
$input所以,首先我尝试了将变量转储到控制台的常用技术,确认属性是以预期值传递的:
NoteProperty1 : {some, value}
NoteProperty2 : {some, other, value}
PSComputerName : my-computer
RunspaceId : d1f35c8b-f631-4caa-bae0-f7c0066bbd55 …Run Code Online (Sandbox Code Playgroud) 我正在编写通用的PowerShell脚本来在远程计算机上执行部署.我遇到了一个我无法超越的问题,这个问题是ArgumentList传递的Scriptblock中带双引号的参数
我有这样的事情:
$remoteAddress = "some-pc"
$deploymentCommand = "D:\some path\Command.exe"
$deploymentPackages = @(`"“package - one - external"`", `"“package - two - external"`", `"“package - three - internal"`")
foreach ($deploymentPackage in $deploymentPackages)
{
invoke-command -ComputerName $remoteAddress -ScriptBlock { param ($deployCmd, $deployPackage) & $deployCmd -package:$deployPackage -action:doit } -ArgumentList $deploymentCommand,$deploymentPackage
}
Run Code Online (Sandbox Code Playgroud)
我在$ deploymentPackages中添加了双引号.而且我仍然像我一样快速执行我的命令(当然失败了):
D:\some path\Command.exe -package:package - one - external -action:doit
D:\some path\Command.exe -package:package - two - external -action:doit
D:\some path\Command.exe -package:package - three - external -action:doit
Run Code Online (Sandbox Code Playgroud)
适当的执行路径应该是:
D:\some path\Command.exe -package:"package - three - …Run Code Online (Sandbox Code Playgroud) PowerShell Web Access允许您通过Web浏览器运行PowerShell cmdlet.它显示了一个基于Web的控制台窗口.
有没有办法在不将它们输入控制台窗口的情况下运行cmdlet?有没有办法让结果回来?
我正在设想一个应用程序,让非技术用户重新启动打印队列(例如),而不必知道PowerShell.应用程序将显示打印队列列表,然后用户可以选择一个并重新启动队列.该应用程序本质上是一个包装器,负责处理语法和变量,以便用户不需要知道.
有没有办法通过PowerShell Web Access实现这一目标?或者是否还有其他方法可以让非Windows应用程序在不重新发明轮子的情况下向Windows服务器发送任意命令?
我一直试图用PowerShell远程安装来安装Windows 10通用应用程序.我已经尝试了所有我能想到的所以现在我转向你希望有人可以给我一个答案或解释为什么我的方法不起作用.替代解决方案也受到赞赏.
基本上我想要做的是能够远程安装Windows 10应用程序,我的方法包括将文件下载到目标计算机并使用PowerShell远程处理来运行安装.这是我的脚本的简化版本:
$computerName = 'XYZ'
$userName = 'abc'
$newCred = Get-Credential "$computerName\$userName"
$newSession = New-PSSession -ComputerName $computerName -Credential $newCred -ErrorAction Stop
Invoke-Command -Session $newSession -ErrorAction Stop -Verbose -Scriptblock {
function installApp($srcDirectory) {
$installer = Get-ChildItem "$srcDirectory\App.Test*\Add-AppDevPackage.ps1" | Select-Object -ExpandProperty FullName
&($installer)
}
$srcDirectory = "$($env:TEMP)/TestApp"
installApp($srcDirectory)
}
Remove-PSSession $newSession
Run Code Online (Sandbox Code Playgroud)
基本上它所要做的就是运行在visual studio中生成的生成脚本以安装应用程序.但是,当我运行它时,我得到以下内容:
Installing app...
Add-AppxPackage : Deployment failed with HRESULT: 0x80073CF6, Det gick inte att registrera paketet.
error 0x80070005: Adding a tile failed with unexpected error.
NOTE: For additional …Run Code Online (Sandbox Code Playgroud) 我正在尝试执行以下代码。这些错误是不言自明的,但仅在远程运行时发生。在本地运行时,所有代码都可以正常工作,我可以通过从需要Tls12的Web服务器中提取内容并在未更改安全协议的情况下收到错误来验证它们是否具有预期的效果。
$tls12 = [Enum]::ToObject([Net.SecurityProtocolType], 3072)
[Net.ServicePointManager]::SecurityProtocol = $tls12
Run Code Online (Sandbox Code Playgroud)
在服务器上运行时,它们可以完美执行。通过Invoke-Command远程运行时,出现此错误。
Exception setting "SecurityProtocol": "The requested security protocol
is not supported."
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : PropertyAssignmentException
+ PSComputerName : servername
Run Code Online (Sandbox Code Playgroud)
或者,这行代码从根本上是相同的。
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
Run Code Online (Sandbox Code Playgroud)
直接在服务器上运行时,此方法也有效,但在远程运行时,会导致此错误。
Exception setting "SecurityProtocol": "Cannot convert null to type
"System.Net.SecurityProtocolType" due to invalid enumeration values. Specify one of the following enumeration values and
try again. The possible enumeration values are "Ssl3, Tls"."
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : …Run Code Online (Sandbox Code Playgroud)