簡體   English   中英

一些powershell cmd - 如果從python運行則不可用?

[英]Some powershell cmd-lets not available if run from python?

所以這是一個不尋常的,也許我只是錯過了顯而易見的,但我有以下python代碼創建一個powershell腳本並運行它。

# Create the PowerShell file 
f = open("getKey.ps1", "w")

f.write('$c = Get-BitlockerVolume -MountPoint C:\n')
f.write('$c.KeyProtector[1].RecoveryPassword | Out-File C:\\Temp\\recovery.key\n')

# Invoke Script
startPS = subprocess.Popen([r'C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe',
                                           '-ExecutionPolicy', 'Unrestricted', './getKey.ps1'], cwd=os.getcwd())

result = startPS.wait()

當它運行時,它給我以下錯誤:

The term 'Get-BitlockerVolume' is not recognized as the name of a cmdlet, function, script file, or operable program.

但是,如果我然后手動運行生成的腳本,它將完美地運行。 為了增加奇怪性,如果我完全按照上面那樣運行相同的命令,即:

C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy Unrestricted ./getKey.ps1

它也完全按預期工作。

顯然,上述錯誤是一個PowerShell錯誤,因此它成功運行了腳本。 看起來好像PowerShell以某種方式知道這是從python運行的,並且當從特定源運行腳本時,它具有一些受限制的命令庫。 我認為這個想法沒有任何意義,但它肯定是出現的。

我不認為這是一個權限問題,因為當你從一個無法升級的PowerShell提示符運行相同的命令時,會得到一個Access被拒絕的類型錯誤,而不是一個命令不存在的那種錯誤。

無論如何,任何幫助將不勝感激!

  • 編輯

編輯:新證據幫助解決這個問題:

這絕對是正確加載cmdlet的問題。 如果我以編程方式運行腳本以將所有可用命令的列表轉儲到文本文件中,那么它只有大約2/3的大小,就像我直接通過powershell提示一樣

我敢打賭Python在64位Windows上作為32位進程運行。 在這種情況下,您最終將運行32位PowerShell,這實際上是一件壞事,因為許多PowerShell模塊依賴於可能沒有32位等效的本機二進制文件。 我使用IIS管理器命令行開關 - 命令行程序本身在32位PowerShell中注冊,但它們依賴的基礎COM對象不是。

如果需要從32位進程運行64位PowerShell,請將路徑指定為%SystemRoot%\\ SysNative \\ WindowsPowerShell \\ v1.0 \\ PowerShell.exe而不是System32。

System32實際上是針對32位進程虛擬化的,並且是指%SystemRoot%\\ SysWow64中的32位二進制文​​件。 這就是你的路徑(和PSMODULEPATH)看起來相同但不是這樣的原因。 (SysNative也是僅存在於虛擬化32位進程中的虛擬化路徑。)

添加@jbsmith在評論中所說的內容,還要確保在python啟動進程時正確填充PowerShell依賴的環境變量來知道模塊的位置。

%PSMODULEPATH%是有問題的環境變量,它的工作方式與%PATH%變量相同,多個目錄分隔; 根據您所說的觀察到的行為,您似乎正在使用PowerShell 3.0,並且cmdlet自動加載已生效。

這里的解決方案: 從python運行一個使用Web管理模塊的powershell腳本,為我提供了我需要的cmdlet,但即使使用此方法,仍然缺少cmdlet。 我仍然不知道為什么有些人被加載而其他人沒有,但是暫時,我的腳本做了我需要的東西,我不能再花時間去弄明白了。

這里參考的代碼對我有用

startPS = subprocess.Popen([r'C:\Windows\sysnative\cmd.exe', '/c', 'powershell',
    '-ExecutionPolicy', 'Unrestricted', './getKey.ps1'], cwd=os.getcwd())

我有同樣的問題,只是沒有安裝BitLocker功能,因此模塊不存在。

我通過安裝Bitlocker功能修復了它:

Windows Server:

Install-WindowsFeature BitLocker -IncludeAllSubFeature -IncludeManagementTools -Restart

Windows桌面:

Enable-WindowsOptionalFeature -Online -FeatureName BitLocker -All

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM