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
...到 DC(或具有 RSAT 工具的另一个主机),将这些 cmdlet 代理到您的 PowerShell 会话,那么它们甚至不可用。
您也没有使用 cmdlet 语法属性。
这会让人认为您是使用 PowerShell 进行 ADDS 的新手,这没问题,但在尝试与外部语言合并之前,您应该先熟悉这两种语言。
跳转到 Youtube 搜索
- “PowerShell 入门”,
- “中级 PowerShell”,
- “高级 PowerShell”
- 并搜索‘PowerShell 活动目录’
- 和'PowerShell 活动目录 Get-ADPrincipalGroupMembership'
因此,这就是我在其他评论中说明的内容。如果您尝试将其从 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