Набор параметров не может быть разрешен с использованием указанных именованных параметров - PullRequest
1 голос
/ 19 февраля 2020

В приведенном ниже скрипте должны быть указаны параметры -live или -test. Тем не менее, скрипт будет работать без любого переключателя. Если я использую один из этих параметров, я получаю ошибку ниже. Почему он не требует -live или -test и почему он не работает, если я использую один из них?

C: \ Users \ Администратор \ Documents \ Disable-ADAccounts.ps1: Параметр набор не может быть разрешен с использованием указанных именованных параметров. В строке: 1 символ: 1 +. . \ Disable-ADAccounts.ps1 -days 7 -all -live + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~ + CategoryInfo: InvalidArgument: (:) [Disable-ADAccounts.ps1], ParameterBindingException + FullyQualifiedErrorId: AmbiguousParameterSet, Disable-ADAccounts.ps1

    [CmdletBinding()]
    param (
    [Parameter(Mandatory = $true, ParameterSetName = 'UsersOnly')]
    [Switch]
    $usersOnly,

    [Parameter(Mandatory = $true, ParameterSetName = 'ComputersOnly')]
    [Switch]
    $computersOnly,

    [Parameter(Mandatory = $true, ParameterSetName = 'All')]
    [Switch]
    $all,

    [Parameter(Mandatory=$true)]
    [string]
    $days,

    [switch]
    $console,

    [Parameter(Mandatory = $true, ParameterSetName = 'Test')]
    [switch]
    $test,

    [Parameter(Mandatory = $true, ParameterSetName = 'Live')]
    [switch]
    $live
)

Process {
    $DC = Get-ADDomainController
    $OUs = Get-ADOrganizationalUnit -Filter * # Uncomment this line to search ALL OUs.  Comment Next Variable.
    #$OUs = Get-ADOrganizationalUnit -Filter 'Name -eq "test"' # Use this line to test on a single OU
    $TimeStamp = get-date -format D
    $description = "Disabled on " + $TimeStamp
    $noDisableComputer =  Get-ADGroupMember -Identity DoNotDisableComputers -Recursive | Select -ExpandProperty Name
    $noDisableUser =  Get-ADGroupMember -Identity DoNotDisableUsers -Recursive | Select -ExpandProperty Name
    $noDisable = $noDisableComputer+$noDisableUser
    $CurrentDate = Get-Date
    $CurrentDate = $CurrentDate.ToString('yyMMdd_hhmmss')
    $tempDir = [System.Environment]::GetEnvironmentVariable('TEMP','Machine')
    $logFile = $tempDir + "\DisabledAccounts_$CurrentDate.csv"

    # If -test switch is used enable -WhatIf parameter.
    If($test) { $whatIf = @{ WhatIf = $true } }
    ElseIf($live) { $whatIf = @{ WhatIf = $false } }

    # Set parameter to UsersOnly, ComputersOnly, or do not use a perameter
    If($usersOnly) { $scope = @{ UsersOnly = $true } }
    ElseIf($computersOnly) { $scope = @{ ComputersOnly =$true } }
    ElseIf($all) { $scope = @{} }

    # Disable User and/or Computer Objects inactive for XX days.

    # Iterate through Organizational Units
    foreach ($OU in $OUs) {

        # Search for User and/or Computer Objects inactive for XX days.  Disable object if not in DoNotDisable Security Groups
        $days = $days + "D"
        $accounts = Search-ADAccount -SearchBase $OU.DistinguishedName -SearchScope OneLevel -AccountInactive -TimeSpan ([timespan]7D) @scope
        foreach($account in $accounts){
            If ($noDisable -notcontains $account.Name) {
                Write-Host $account
        #        #Disable-ADAccount -Identity $account.DistinguishedName -Verbose $whatIf | Export-Csv $logFile
           }
        }
    }
}    

        # Move Disabled Users to Disabled Users OU & Add Timestamp to Description
        #Search-ADAccount –AccountDisabled –ComputersOnly –SearchBase $OU.DistinguishedName | Foreach-object {
            #Set-ADComputer $_ -Description $description -Verbose -WhatIf
            #Move-ADObject $_ –TargetPath “OU=Disabled Computers, DC=COH,DC=net” -Verbose -WhatIf
        #}
    #}

1 Ответ

4 голосов
/ 19 февраля 2020

Я думаю, что вы запутались в наборе параметров. Вы создали пять отдельных наборов параметров, и только один из этих пяти может быть активным в любой момент. Если я правильно прочитал ваше намерение, вам нужна способность выполнить любое из следующих действий:

 \Disable-ADAccounts.ps1 -days 7 -all -live
 \Disable-ADAccounts.ps1 -days 7 -UsersOnly -live
 \Disable-ADAccounts.ps1 -days 7 -ComputersOnly -live
 \Disable-ADAccounts.ps1 -days 7 -all -test
 \Disable-ADAccounts.ps1 -days 7 -UsersOnly -test
 \Disable-ADAccounts.ps1 -days 7 -ComputersOnly -test

Если это так, вам нужно шесть разных групп параметров, а не пять. Каждый из ваших параметров должен входить в группы, в которых он необходим, поэтому что-то вроде этого:

[Parameter(Mandatory = $true, ParameterSetName = 'UsersOnlyLive')]
[Parameter(Mandatory = $true, ParameterSetName = 'UsersOnlyTest')]
[Switch]
$usersOnly,

[Parameter(Mandatory = $true, ParameterSetName = 'ComputersOnlyLive')]
[Parameter(Mandatory = $true, ParameterSetName = 'ComputersOnlyTest')]
[Switch]
$computersOnly,

[Parameter(Mandatory = $true, ParameterSetName = 'AllLive')]
[Parameter(Mandatory = $true, ParameterSetName = 'AllTest')]
[Switch]
$all,

[Parameter(Mandatory=$true)]
[string]
$days,

[switch]
$console,

[Parameter(Mandatory = $true, ParameterSetName = 'AllTest')]
[Parameter(Mandatory = $true, ParameterSetName = 'UsersOnlyTest')]
[Parameter(Mandatory = $true, ParameterSetName = 'ComputersOnlyTest')]
[switch]
$test,

[Parameter(Mandatory = $true, ParameterSetName = 'AllLive')]
[Parameter(Mandatory = $true, ParameterSetName = 'UsersOnlyLive')]
[Parameter(Mandatory = $true, ParameterSetName = 'ComputersOnlyLive')]
[switch]
$live

См. эту статью Microsoft для получения дополнительной информации о наборах параметров.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...