在Powershell

时间:2019-02-02 01:36:07

标签: powershell active-directory

我试图创建一个PowerShell脚本,将抓住所有启用的Active Directory帐户,和非活动期为90天。该脚本将提示用户在查询计算机或用户帐户之间进行选择。 根据选择,它将作为变量传递给主命令。

如果我不传递变量,这些命令将正常工作。

我不知道如果我想要做的是可能的。

对不起,任何错误的代码格式。刚开始。

    Clear-Host
    write-host "`nProgram searches for Enabled AD users account that have not logged in for more than 90 days. `nIt searches the entire domain and saves the results to a CSV file on users desktop." "`n"


    $choice = Read-host -Prompt " What do you want to search for Computer or Users Accounts`nType 1 for users`nType 2 for Computers`n`nChoice"



$account
if ($choice -eq 1){
   $account = UsersOnly 
   }
Elseif($choice -eq 2){
   $account = ComputersOnly
   }
Else{
   write-host "This is not an option `n exiting program"
   exit
   }



                $FileName = Read-Host -Prompt "What do you want to name the CSV file"
                $folderPath = "$env:USERPROFILE\Desktop\$FileName.csv"

                Search-ADAccount -AccountInactive -TimeSpan 90 -$account | Where-Object { $_.Enabled -eq $true } | select Name, UserPrincipalName, DistinguishedName | Export-Csv -Path $folderPath

1 个答案:

答案 0 :(得分:4)

Splatting是实现此目标的方法。之所以这样命名,是因为您使用@而不是$引用了一个变量,并且@的类型看起来像是“飞溅”。

它通过创建一个哈希表来工作,哈希表是一种字典(键/值对)。在PowerShell中,我们使用@{}创建哈希表文字。

要使用splatting,您只需创建一个哈希表,其中每个键/值对分别是参数名称和值。

因此,例如,如果您想致电Get-ChildItem -LiteralPath $env:windir -Filter *.exe,也可以这样进行:

$params = @{
    LiteralPath = $env:windir
    Filter = '*.exe'
}

Get-ChildItem @params

您还可以将直接参数与splatting混合并匹配:

$params = @{
    LiteralPath = $env:windir
    Filter = '*.exe'
}

Get-ChildItem @params -Verbose

当您需要有条件地省略参数时,这是最有用的,因此您可以打开它:

if ($executablesOnly) {
    Get-ChildItem -LiteralPath $env:windir -Filter *.exe
} else {
    Get-ChildItem -LiteralPath $env:windir
}

对此:

$params = @{
    LiteralPath = $env:windir
}

if ($executablesOnly) {
   $params.Filter = '*.exe'
}

Get-ChildItem @params

或者这个:

$params = @{}

if ($executablesOnly) {
   $params.Filter = '*.exe'
}

Get-ChildItem -LiteralPath $env:windir @params

只有2种可能的选择,if / else看起来并不那么糟糕,但是随着您选择的增加和变得越来越复杂,它变得噩梦。


您的情况:首先要注意一件事。您要替代的参数是开关参数。这意味着当您提供它们时,通常仅提供参数名称。实际上,这些名称采用的布尔值在提供名称时默认为true。实际上,您可以覆盖它们,因此可以执行Search-ADAccount -UsersOnly:$false,但这是非典型的。

无论如何要提到的一点是,它可能会混淆您如何出于散布目的而在哈希表中设置其值,但是简单的答案只是给他们一个布尔值(通常是$true

因此,只需简单地更改代码即可:

$account = if ($choice -eq 1) {
    @{ UsersOnly = $true }
} elseif ($choice -eq 2) {
    @{ ComputersOnly = $true }
}

# skipping some stuff

Search-ADAccount -AccountInactive -TimeSpan 90 @account

我还将$account分配放在if的左侧而不是内部,但这是您的选择。