我们已经构建了一个连接到我们的Windows服务并执行某些任务的.Net控制台应用程序。如果我将RDP导入Azure VM并运行以下命令,它将完美运行:
& "$toolDir\my.exe" arg1, arg2 arg3
但是,如果我通过New-PSSession创建的远程会话执行此操作,则会失败。这是我创建会话的方式。我将此会话用于许多其他任务,其他一切(包括运行MSI,注册表等)都有效。
$uri = Get-AzureWinRMUri -ServiceName $vmName -Name $vmName
$pwd = convertto-securestring -String $textpwd -AsPlainText -Force
$credentials = new-object -typename System.Management.Automation.PSCredential -argumentlist $username, $pwd
$session = New-PSSession -ComputerName $uri[0].DnsSafeHost -Credential $credentials -Port $uri[0].Port -UseSSL -ErrorAction Stop
我已尝试在此远程会话中以多种方式运行我的exe。我试过了:
exe始终无法连接到服务。我不确定错误的相关性,但这是异常(和内部异常)报告:
There was no endpoint listening at net.pipe://localhost/myservice that could
accept the message. This is often caused by an incorrect address or SOAP action.
The pipe name could not be obtained for net.pipe://localhost/myservice .
同样,当通过RDP在boxhell上运行PowerShell时,这非常有效。所以我认为可能是因为缺少$ profile,所以我在使用CMD在RDP上创建的新PowerShell内部运行:
powershell -NoProfile -NonInteractive -File C:\test.ps1
但这也有效。
RDP和远程会话都使用相同的凭据。远程会话和在RDP中使用PowerShell之间有什么区别可能导致这种情况?
更新:还尝试将exe调用放入服务器上的批处理文件中,然后调用该批处理文件 - 仍然是同样的错误。一切仍然指向远程会话和RDP会话之间的差异。
Invoke-Command -Session $session {
cd c:\mytools
cmd.exe /c runmyexe.bat
}
替代方法:我无法弄清楚如何找到会话之间的差异,因此我利用了已经属于我的安装脚本的重启。我写了一个bat文件并放入启动文件夹,重新启动然后删除它,全部自动。它很棒。仍然有点担心会议有所不同......