将字符串减少一个,直到在AD Powershell中找不到用户

时间:2019-05-06 22:11:29

标签: powershell

我正在尝试创建一个Powershell循环,该循环将一个字符串减少到20个字符,然后将其与当前的Active Directory用户进行比较,如果存在,则它将从末尾删除一个字符,然后再次检查。它将继续这样做,直到找到不是当前用户的字符串为止。这是我目前所拥有的:

$uName = (Read-Host "New User Name")
if ($uName.length -gt 20) {
    $uNameSAM = $uName.SubString(0, 20)
    foreach ($uNameSAMCheck in $uNameSAM) {
    Write-Host "`nDue to length limitations shortening Name to:  $uNameSAM`n" -Foreground Red
}else {
    $uNameSAM  = $uName
}
}

这对于缩短部分来说效果很好,但是我不确定如何根据输入的名称检查AD是否存在,是否再次缩短并再次检查等等。

1 个答案:

答案 0 :(得分:0)

就像赖利提到的那样,这是一种不寻常的实施模式,但不要让我阻止您。

解决此问题的最简单方法是采用某种形式的循环,在这里我想也许while循环可能是合适的。

$Username = Read-Host -Prompt "New User Name"
if ($Username.length -gt 20) {
    $SamAccountName = $Username.SubString(0, 20)
    Write-Warning "Due to length limitations shortening Name to: $uNameSAM"
}
else {
    $SamAccountName = $Username
}

while (Get-ADUser -Filter "SamAccountName -eq $SamAccountName") {
    $SamAccountName = $SamAccountName.Substring(0, $SamAccountName.Length - 1)
}

Write-Host -ForegroundColor Green "'$SamAccountName' is available!"

有许多可能的方法。这一特定功能利用了您可以利用PS的本机类型强制性这一事实。 while循环(以及if语句,until循环等)期望布尔结果。如果cmdlet完全返回 any 复杂对象,则通常会将其强制为$true。如果返回的结果为空/空,则将其强制为$false

在处理整数,字符串等基本数据类型时,此行为有些棘手,但是对于处理复杂的对象,这是一种非常简单的方法,可以询问“此命令给了我任何输出”。对于Get-ADUser -Filter,如果过滤器与用户不匹配,则不会生成任何输出。

我们不想使用Get-ADUser -Identity,因为不幸的是,如果找不到所需的用户,这将引发终止错误。到处编码可能会有点烦人,因此我选择了-Filter方法。