我正在Windows 2012目标节点上通过Rundeck(在线)运行多个python脚本。这些脚本曾经在本地运行,但现在正在移至运行平台。
其中一个python脚本打开了子流程,以调用powershell脚本并读取输出。
import subprocess
CMD = [r'C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe ', '-File', r'C:\Users\Osman\Code\mop.ps1']
cmd = CMD[:]
cmd.append('arg1')
cmd.append('arg2')
cmd.append('arg3')
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
r = p.communicate()
print(r)
mop.ps1是
Import-Module MSOnline
$domain = $args[0]
$login = $args[1]
$pass = $args[2]
$EPass = $pass | ConvertTo-SecureString -AsPlainText -Force
$Cred = New-Object System.Management.Automation.PsCredential($login, $EPass)
Connect-MsolService -Credential $Cred
$TenantId = Get-MsolPartnerContract -Domain $domain | Select-Object -ExpandProperty TenantId
Get-MsolAccountSKU -TenantId $TenantId | select SkuPartNumber,ActiveUnits,ConsumedUnits | ConvertTo-Csv -NoTypeInformation
这部分代码始终无法执行,如果我检查stderr,它会说:
Connect-MsolService : Exception of type 'Microsoft.Online.Administration.Automation.MicrosoftOnlineException' was thrown.
At C:\Users\Osman\Code\mop.ps1:7 char:1
+ Connect-MsolService -Credential $Cred
我不确定为什么会失败。我尝试过
Import-Module MSOnline -Verbose
我可以看到正在加载Cmdlet。我尝试在C:\WINDOWS\system32\WindowsPowerShell\v1.0\
位置创建profile.ps1文件。
如果我在本地执行代码,则一切正常。我尝试运行常规的测试.ps1文件'disk.ps1'而不是我的代码,由于它不会加载任何模块,因此可以正常工作:
get-WmiObject win32_logicaldisk -Computername $env:computername
使带有模块的脚本正常运行的解决方法是什么? stdout始终为空。
节点注册为64位,因此我尝试将cmd更改为
C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe
我尝试将profile.ps1复制到那里,将Module复制到那里,但是仍然无法通过rundeck正常工作。
答案 0 :(得分:0)
根据您的描述,由于在直接从服务器运行脚本时能够获得有效的输出,因此错误可能与您用于登录的“ Second Hop”有关MS在线。当前,Rundeck Python-Winrm plugin支持基本身份验证,ntlm身份验证或CredSSP身份验证,而CredSSP身份验证可让您成功执行第二跳。