使用Powershell查询(AD)成员

时间:2018-06-01 14:45:34

标签: powershell

我有一个简单的菜单,可让您选择要对Active Directory中的用户执行的任务。我想要执行的任务之一是显示用户组成员身份。为此,我使用以下代码。我的问题是,在DO部分,显示组成员资格的选项3中,当您浏览菜单时输出似乎是空白的。如果我只运行该选项中的代码选择,它就可以正常工作。

function Show-Menu
{
    param (
        [string]$Title = 'My Menu'
    )
    Clear-Host
    Write-Host "================ $Title ================"

    Write-Host "1: Unlock User"
    Write-Host "2: Disable User"
    Write-Host "3: Show Groups"
    Write-Host "Q: Press 'Q' to quit."
}


cls

#User Lookup
write-host 'First, lets look up the user you want to work with'
$user = Read-Host 'Enter the name of the user you want to search for!'
$w = "*"
$search = $w + $user + $w
Get-ADUser -F 'name -like $search' | FT SamAccountName -A

#User Selection
$target_user = Read-Host 'Which user do you want to work with?'
cls

do
 {
     Show-Menu
     $selection = Read-Host "Please make a selection"
     switch ($selection)
     {
           '1' {unlock-ADAccount -Identity $target_user} 
           '2' {Disabled-ADAccount -Identity $target_user} 
           '3' {Get-ADPrincipalGroupMembership $target_user | select name} 

     }
     pause
 }
 until ($selection -eq 'q')
 clear

1 个答案:

答案 0 :(得分:0)

如果停止脚本,您将看到选项3的调用输出。

以下作品:

'3' {Get-ADPrincipalGroupMembership $target_user | select name | Out-Host }

或有点令人惊讶

'3' {Get-ADPrincipalGroupMembership $target_user | select name | ft }

问题是select-object写入stdoutpause写入控制台,这是两个不同且冲突的输出(如果stdout转到控制台)。 GroupMembership cmdlet生成输出到stdout,但Powershell缓冲stdout,因为它已通过Show-Menu检测到控制台的输出。可能它会首先显示几个KiB的直接模式控制台输出,然后通过stdout写入向控制台显示间接输出。或者它将在脚本完成时显示stdout缓冲输出,并将直接输出杀死到控制台缓冲区,并刷新stdout次写入。

所以,这里的解决方案是直接写给Host。当然,这样做的缺点是无法将stdout流上的输出重定向到另一个脚本。

A similar discussion on SpiceWorks