Powershell - 脚本顺序

时间:2017-07-25 05:38:09

标签: powershell scripting

我正在尝试使用变量输入用户并检查活动目录以确认用户的全名并在运行下一个命令之前暂停脚本。

脚本在get-aduser命令之前运行pause命令 - 请参阅下面的脚本

#Enter Username

$username = read-host "Username"


Get-ADUser -Filter "Name -eq '$username'" | Select-Object name, samaccountname

$x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")

#Removes user from groups

Get-ADPrincipalGroupMembership -Identity $username | where {$_.Name -notlike "Domain Users"} |% {Remove-ADPrincipalGroupMembership -Identity $uSername -MemberOf $_ -Confirm:$false}

write-output End

$x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")

3 个答案:

答案 0 :(得分:0)

根据我的经验,Get-ADUser和类似命令可能需要很长时间才能运行,可能长达20秒左右。很少,我发现由于某些命令在它之前或之后运行,它使代码无法使用。如果您想测试以确定是否真的如此,请在代码中的每一行之间添加此行:

Read-Host -Prompt "Press Enter to continue"

这样,你可以测试你把那条线放在那里的时间与不存在之间是否存在真正的区别。如果确实存在差异,您可能需要查看start-sleepwait

答案 1 :(得分:0)

我会做这样的事情让用户验证,因为我认为这就是你所追求的,然后继续撤销用户组成员资格

Write-Host "`nEnter the UserName: " -NoNewline -ForegroundColor Yellow
$UserName = Read-Host

$UserName = Get-ADUser -Filter "Name -eq '$UserName'" | Select-Object Name, SamAccountName

Write-Host "`nRevoke membership of all groups for user" $UserName.Name "("$UserName.SamAccountName")?`n [Y]es, [N]o : " -ForegroundColor Yellow -NoNewline

$Confirmation = Read-Host


While ("y","yes","n","no" -notcontains $Confirmation) {

     Write-Host "`nNot a valid input! Please try again ..." -ForegroundColor Red
     Write-Host "`nRevoke membership of all groups for user" $UserName.Name "("$UserName.SamAccountName")?`n [Y]es, [N]o : " -ForegroundColor Yellow -NoNewline

     $Confirmation = Read-Host

}

If ($Confirmation -eq "n" -or $Confirmation -eq "no") {

    Write-Host "Aborted!" -ForegroundColor Red
    Break

}

# Next step here!

# Get-ADPrincipalGroupMembership -Identity $UserName | where {$_.Name -notlike "Domain Users"} |% {Remove-ADPrincipalGroupMembership -Identity $UserName -MemberOf $_ -Confirm:$false}

答案 2 :(得分:0)

只是另一段代码,这些更改需要一些正确的日志记录和错误处理,而我的代码只记录到控制台它仍然有用。 它使用确认来代替暂停'所以用户可以选择继续或停止。

### CmdletBinding
# Alows the use of -Whatif(not used), -Confirm, -Verbose and -Debug.
# Reference: https://technet.microsoft.com/en-us/library/ff677563.aspx
#            https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.core/about/about_functions_cmdletbindingattribute
#            https://blogs.technet.microsoft.com/poshchap/2014/10/24/scripting-tips-and-tricks-cmdletbinding/
[CmdletBinding(
    SupportsShouldProcess = $true,
    ConfirmImpact=’High’
    )]

# Script parameters.
Param(
    [parameter(HelpMessage = "Command parram, not used.")]$Command = "nothing" 
    #Run with PowerShell Fix, reference: https://social.technet.microsoft.com/Forums/office/en-US/fe7fb473-7ed6-4397-9c95-120201c34847/problems-with-powershell-30?forum=winserverpowershell
    )

#Console clean-up.
Clear-Host

# Set error action to Stop, if something happens and it isnt inside a trap (try/catch) then stop.
$ErrorActionPreference = "Stop" 

# Controls the Verbose Output
$VerbosePreference = "Continue" #Optional

#Intial message for User execution, whitespace is for the progressbars.
"









    Script: Remove-ADUserGroupMembership.ps1


"

Write-Verbose "Starting main loop."
While ($true){

    #White space for in between questions.
    Write-Host  "
    "

    #Retrieve username from user input.
    Write-Host "Provide the ADUser for ADGroup removal here:"
    $Username = read-host "Username"

    #Retrieve ADUser object from AD.
    Write-Verbose "Querying Active Directory for user $Username"
    Try {
        $ADUser = Get-ADUser $Username
        Write-Verbose "User Found, $($ADUser.Name) "
    }

    catch [Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException] {
        Write-Warning "Could not find user $Username in Active Directory, check spelling and try again."
        Continue #this wil reset the while loop
    }

    Catch {
        Write-Warning "Unknown Errror, Could not retrieve user $Username from Active Directory, please try again."
        Continue #this wil reset the while loop
    }

    #Retrieve GroupMembership for user.
    Write-Verbose "Querying Active Directory for GroupMembership of User $($ADUser.name), exluding Domain Users"
    Try {
        $GroupMembership = $ADUser | Get-ADPrincipalGroupMembership | where {$_.Name -notlike "Domain Users"}
        Write-Verbose "Found $($GroupMembership.count) GroupMemberships for User $($ADUser.name) (Not inluding Domain Users)"
    }

    Catch {
        Write-Warning "Unknown Errror, Could not retrieve GroupMembership for user $($ADUser.Name) from Active Directory, please try again."
        Continue #this wil reset the while loop
    }

    #Remove GroupMembership for user.
    if ($pscmdlet.ShouldProcess("$($ADUser.name)", "Remove-ADPrincipalGroupMembership {$($GroupMembership.count) Groups}")) {
        Write-Verbose "Entering GroupMembership removal loop for user $($ADUser.name)"
        Foreach ($Group in $GroupMembership) {
            Try {                
                $ADUser | Remove-ADPrincipalGroupMembership -MemberOf $Group -WhatIf -Confirm:$true                
                Write-Verbose "$Group removed from from user $($ADUser.name)"
            }

            catch  {
                Write-Warning "An Error occured, could not remove group $Group from user $($ADUser.Name)"
                Continue #this will skip this group.
            }
        }
    } 

    else {
        Write-Warning "Action Remove-ADPrincipalGroupMembership {$($GroupMembers.count) Groups} canceled for $($ADUser.name)"
    }

    Read-Host "Press Enter to exit."
    break #exit from while loop
}