如何在 python 中使用管道执行 powershell 命令?

如何在 python 中使用管道执行 powershell 命令?
import subprocess
subprocess.Popen('powershell.exe [Get-ADPrincipalGroupMembership %USERNAME% | select name]')
os.system('powershell.exe Get-ADPrincipalGroupMembership %USERNAME% | select name]')

我尝试过这两种方法,用不同的方法逃避每个字符,排除每个字符等等。我迷路了。

我想要做的就是在 Python 中有一个函数运行 Get-ADPrincipalGroupMembership,将其通过管道传输到 select,然后通过管道传输到 out-file,这样我就可以存储它了。但是,如果我在命令中包含一个管道,窗口在打开时将始终关闭,并且不会产生任何输出。

我无法判断哪里出了问题,因为我看不到 PS 窗口在做什么,而且我不知道为什么它具体存在管道问题。

谢谢,

答案1

您在 PowerShell 中混合了 Python/cmd.exe 变量名。

PowerShell 不知道 %USENAME% 是什么并且会出错,因为它不是 PowerShell 构造。

您绝对应该看到 PowerShell.exe 控制台正在做什么,因为您正在使用外部来调用 Powershell.exe,并且这是一个与您所在的 python 会话完全独立的会话启动。

因此,您不仅会看到 Python 控制台,还会弹出 PowerShell 控制台,如果您想查看它在做什么,则需要使用 pause、-wait 或 noexit 开关。有关更多详细信息,请参阅 PowerShell 帮助文件。

PowerShell 自动变量要求您指定用户名,如下所示:

$env:USERNAME

不是这个:

%USERNAME%

PowerShell 有许多来自 Env 驱动器的自动变量。

Get-PSDrive | Format-Table -AutoSize
<#
# Results

Name     Used (GB) Free (GB) Provider    Root                CurrentLocation
----     --------- --------- --------    ----                ---------------
...                                
Env                          Environment                                    
...
#>

Get-ChildItem -Path 'env:\'
<#
Name                           Value                                                                                                                                                       
----                           -----                                                                                                                                                       
ALLUSERSPROFILE                C:\ProgramData                                                                                                                                              
APPDATA                        C:\Users\Daniel\AppData\Roaming                                                                                                                             
CommonProgramFiles             C:\Program Files\Common Files                                                                                                                               
CommonProgramFiles(x86)        C:\Program Files (x86)\Common Files                                                                                                                         
CommonProgramW6432             C:\Program Files\Common Files                                                                                                                               
COMPUTERNAME                   LP70                                                                                                                                                        
ComSpec                        C:\Windows\system32\cmd.exe                                                                                                                                 
DriverData                     C:\Windows\System32\Drivers\DriverData                                                                                                                      
HOMEDRIVE                      C:                                                                                                                                                          
HOMEPATH                       \Users\Daniel                                                                                                                                               
LOCALAPPDATA                   C:\Users\Daniel\AppData\Local                                                                                                                               
LOGONSERVER                    \\LP70                                                                                                                                                      
MSMPI_BENCHMARKS               C:\Program Files\Microsoft MPI\Benchmarks\                                                                                                                  
MSMPI_BIN                      C:\Program Files\Microsoft MPI\Bin\                                                                                                                         
NUMBER_OF_PROCESSORS           8                                                                                                                                                           
OneDrive                       C:\Users\Daniel\OneDrive                                                                                                                                    
OneDriveConsumer               C:\Users\Daniel\OneDrive                                                                                                                                    
OS                             Windows_NT                                                                                                                                                  
Path                           C:\Program Files\Microsoft MPI\Bin\;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System...
PATHEXT                        .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.CPL                                                                                                  
POWERSHELL_DISTRIBUTION_CHA... MSI:Windows 10 Pro                                                                                                                                          
PROCESSOR_ARCHITECTURE         AMD64                                                                                                                                                       
PROCESSOR_IDENTIFIER           Intel64 Family 6 Model 94 Stepping 3, GenuineIntel                                                                                                          
PROCESSOR_LEVEL                6                                                                                                                                                           
PROCESSOR_REVISION             5e03                                                                                                                                                        
ProgramData                    C:\ProgramData                                                                                                                                              
ProgramFiles                   C:\Program Files                                                                                                                                            
ProgramFiles(x86)              C:\Program Files (x86)                                                                                                                                      
ProgramW6432                   C:\Program Files                                                                                                                                            
PSModulePath                   C:\Users\Daniel\Documents\WindowsPowerShell\Modules;C:\Program Files\WindowsPowerShell\Modules;C:\Windows\system32\WindowsPowerShell\v1.0\Modules;C:\Prog...
PUBLIC                         C:\Users\Public                                                                                                                                             
PyCharm Community Edition      C:\Program Files\JetBrains\PyCharm Community Edition 2019.2.4\bin;                                                                                          
SystemDrive                    C:                                                                                                                                                          
SystemRoot                     C:\Windows                                                                                                                                                  
TEMP                           C:\Users\Daniel\AppData\Local\Temp                                                                                                                          
TMP                            C:\Users\Daniel\AppData\Local\Temp                                                                                                                          
USERDOMAIN                     LP70                                                                                                                                                        
USERDOMAIN_ROAMINGPROFILE      LP70                                                                                                                                                        
USERNAME                       Daniel                                                                                                                                                      
USERPROFILE                    C:\Users\Daniel                                                                                                                                             
windir                         C:\Windows 
#>

你可以通过变量名找到它们:

$env:USERNAME
$env:USERPROFILE
$env:COMPUTERNAME

你可能真的很擅长 Python,但为什么要用 Python 来做 PowerShell 的事情,而不是直接使用 PowerShell,尤其是在尝试使用 ADDS (RSAT) cmdlet 时?除非你的主机上安装/启用了 Windows RSAT

适用于 Windows 7 Service Pack 1 (SP1) 的远程服务器管理工​​具

自动安装适用于 Windows 10 1809、1903 和 1909 的 RSAT

无需安装任何软件即可使用 PowerShell Active Directory 命令

或者您已建立隐式/显式 Powershell 远程连接

about_Remote - PowerShell | Microsoft Docs

PowerShell 隐式远程活动目录

...到 DC(或具有 RSAT 工具的另一个主机),将这些 cmdlet 代理到您的 PowerShell 会话,那么它们甚至不可用。

您也没有使用 cmdlet 语法属性。

获取 ADPrincipalGroupMembership

这会让人认为您是使用 PowerShell 进行 ADDS 的新手,这没问题,但在尝试与外部语言合并之前,您应该先熟悉这两种语言。

跳转到 Youtube 搜索

因此,这就是我在其他评论中说明的内容。如果您尝试将其从 Python 会话中分离出来,而不是直接从 PowerShell 中分离出来,那么这可能会有点挑战性,因为 Python 需要运行并调用 PowerShell 才能让 Powershell 拥有运行给定 cmdlet 的资源。我没有 Python 环境,也不需要它来测试它。我每天都会进行 PSremting,业内许多人也是如此,而且效果很好。

# Change this...
import subprocess
subprocess.Popen('powershell.exe [Get-ADPrincipalGroupMembership %USERNAME% | select name]')
os.system('powershell.exe Get-ADPrincipalGroupMembership %USERNAME% | select name]')

# To this, Impot the process 
import subprocess
# Use a subprocess to start powershel.exe, which creates an implicit PowerShell remote session to a DC to proxy the RSAT/ADDS cmdlets to get group information
subprocess.call(["C:\\WINDOWS\\system32\\WindowsPowerShell\\v1.0\\powershell.exe", "$DCSssion = New-PSSession –ComputerName 'YourDCName'", "Invoke-Command –Session $DCsession –ScriptBlock {Get-ADPrincipalGroupMembership -Identity $env:USERNAME | Select-Object -Property Name}"])

注意事项:要调用远程主机上的命令,您必须是该远程主机的管理员。

***根据您的帖子更新 ***

我无法很好地处理数据,而且它非常笨重,但它确实有效

按照设计/默认,PowerShell 返回对象,而不是字符串。因此,当您运行类似这样的程序时...

Get-ADPrincipalGroupMembership -Identity $ntaccount1 |
select-Object -Property Name | 
Where-Object {$PSItem.name -like '*certain string*' } |
Sort Name

您得到的只是一个属性对象。名称按升序排序。如果您想要的只是一个属性,您也可以这样做...

(Get-ADPrincipalGroupMembership -Identity $ntaccount1).Name |
Where-Object {$PSItem.name -like '*certain string*' } |
Sort-Object -Property Name

当然,如果您想查看单个用户对象的所有属性……

Get-ADPrincipalGroupMembership -Identity '*'|
select-Object -First 1 
select-Object -Property '*'

如果你把它放在一个变量中,你只需要点引用每个属性

$ADpgm = Get-ADPrincipalGroupMembership -Identity '*' |
select-Object -First 1 
select-Object -Property '*'


# See all properties and methods on an object
$ADpgm | Get-Member

# Get one property value
$ADpgm.Name


# Get specifics for a module, cmdlet, or function
(Get-Command -NameGet-ADPrincipalGroupMembership).Parameters
(Get-Command -NameGet-ADPrincipalGroupMembership).Parameters.Keys
Get-help -NameGet-ADPrincipalGroupMembership -Examples
Get-help -NameGet-ADPrincipalGroupMembership -Full
Get-help -NameGet-ADPrincipalGroupMembership -Online

相关内容