Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于生成samAccountName的Powershell函数_Powershell_Active Directory - Fatal编程技术网

用于生成samAccountName的Powershell函数

用于生成samAccountName的Powershell函数,powershell,active-directory,Powershell,Active Directory,我正在尝试编写一个PS函数,它将FirstName和LastName作为参数,并返回samaccountname。下面是函数应该如何工作的算法 姓名:Richard Testing 现在看看是否登录了richard。如果采取了richard,请尝试richard.t。如果使用了richard.t,请尝试richard.te。如果选择了richard.te,请尝试richard.tes,依此类推 下面是我的代码。我认为这可以用比if循环更简单的方法来实现 $FirstName = "Richard

我正在尝试编写一个PS函数,它将
FirstName
LastName
作为参数,并返回
samaccountname
。下面是函数应该如何工作的算法

姓名:Richard Testing

现在看看是否登录了richard。如果采取了
richard
,请尝试
richard.t
。如果使用了
richard.t
,请尝试
richard.te
。如果选择了
richard.te
,请尝试
richard.tes
,依此类推

下面是我的代码。我认为这可以用比if循环更简单的方法来实现

$FirstName = "Richard"
$LastName = "Testing"

function Remove-StringLatinCharacters {
    Param([string]$String)
    [Text.Encoding]::ASCII.GetString([Text.Encoding]::GetEncoding("Cyrillic").GetBytes($String))
}

$FirstnameToUPN = (Remove-StringLatinCharacters -String $firstname).ToLower()
$LastnamenameToUPN = (Remove-StringLatinCharacters -String $lastname).ToLower()

$user = $(try {Get-ADUser $FirstnameToUPN} catch {$null})
if ($user -ne $null) {
    $upn = $FirstnameToUPN + "." + $LastnamenameToUPN[0]
    $user = $(try {Get-ADUser $upn} catch {$null})
    if ($user -ne $null) {
        $upn = $FirstnameToUPN + "." + $LastnamenameToUPN[0]+$LastnamenameToUPN[1]
        $user = $(try {Get-ADUser $upn} catch {$null})
        if ($user -ne $null) {
            $upn = $FirstnameToUPN + "." + $LastnamenameToUPN[0]+$LastnamenameToUPN[1]+$LastnamenameToUPN[2]
            $user = $(try {Get-ADUser $upn} catch {$null})
            if ($user -ne $null) {
                $upn = $FirstnameToUPN + "." + $LastnamenameToUPN[0]+$LastnamenameToUPN[1]+$LastnamenameToUPN[2]+$LastnamenameToUPN[3]
            } else {
                $upn = $FirstnameToUPN + "." + $LastnamenameToUPN[0]+$LastnamenameToUPN[1]+$LastnamenameToUPN[2]+$LastnamenameToUPN[3]
            }
        } else {
            $upn = $FirstnameToUPN + "." + $LastnamenameToUPN[0]+$LastnamenameToUPN[1]
        }
    } else {
        $upn = $FirstnameToUPN + "." + $LastnamenameToUPN[0]
    }
} else {
    $upn=$FirstnameToUPN
}

编辑#1:

$upn = $FirstnameToUPN
if (Get-Aduser -Filter {SamAccountName -eq $upn}) {
    $upn = $FirstnameToUPN+"."+$LastnamenameToUPN[0]
    if (Get-Aduser -Filter {SamAccountName -eq $upn}) {
        $upn = $FirstnameToUPN + "." + $LastnamenameToUPN[0]+$LastnamenameToUPN[1]
        if (Get-Aduser -Filter {SamAccountName -eq $upn}) {
            $upn = $FirstnameToUPN + "." + $LastnamenameToUPN[0]+$LastnamenameToUPN[1]+$LastnamenameToUPN[2]
            if (Get-Aduser -Filter {SamAccountName -eq $upn}) {
                $upn = $FirstnameToUPN + "." + $LastnamenameToUPN[0]+$LastnamenameToUPN[1]+$LastnamenameToUPN[2]+$LastnamenameToUPN[3]
                if (Get-Aduser -Filter {SamAccountName -eq $upn}) {
                    $upn = $FirstnameToUPN + "." + $LastnamenameToUPN[0]+$LastnamenameToUPN[1]+$LastnamenameToUPN[2]+$LastnamenameToUPN[3]+$LastnamenameToUPN[4]
                    if (Get-Aduser -Filter {SamAccountName -eq $upn}) {
                        $upn = $FirstnameToUPN + "." + $LastnamenameToUPN[0]+$LastnamenameToUPN[1]+$LastnamenameToUPN[2]+$LastnamenameToUPN[3]+$LastnamenameToUPN[4]+$LastnamenameToUPN[5]
                    } else {
                        $upn = $FirstnameToUPN + "." + $LastnamenameToUPN[0]+$LastnamenameToUPN[1]+$LastnamenameToUPN[2]+$LastnamenameToUPN[3]+$LastnamenameToUPN[4]
                    }
                } else {
                    $upn = $FirstnameToUPN + "." + $LastnamenameToUPN[0]+$LastnamenameToUPN[1]+$LastnamenameToUPN[2]+$LastnamenameToUPN[3]
                }
            } else {
                $upn = $FirstnameToUPN + "." + $LastnamenameToUPN[0]+$LastnamenameToUPN[1]+$LastnamenameToUPN[2]+$LastnamenameToUPN[3]
            }
        } else {
            $upn = $FirstnameToUPN + "." + $LastnamenameToUPN[0]+$LastnamenameToUPN[1]
        }
    } else {
        $upn = $FirstnameToUPN+"."+$LastnamenameToUPN[0]
    }
} else {
    $upn = $FirstnameToUPN
}

您只需从名字开始,然后从姓氏中添加字符,直到生成的帐户名在AD中不存在或字符不足:

$acct = $FirstnameToUPN
$cnt  = 1
while (-not (Get-ADUser -Filter "SamAccountName -eq '$acct'") -and $cnt -le $LastnameToUPN.Length) {
    $acct = "${FirstnameToUPN}." + $LastnameToUPN.Substring(0, $cnt)
    $cnt++
}

if (Get-ADUser -Filter "SamAccountName -eq '$acct'") {
    Write-Error "No unused account name found for ${firstname} ${lastname}."
}

您只需从名字开始,然后从姓氏中添加字符,直到生成的帐户名在AD中不存在或字符不足:

$acct = $FirstnameToUPN
$cnt  = 1
while (-not (Get-ADUser -Filter "SamAccountName -eq '$acct'") -and $cnt -le $LastnameToUPN.Length) {
    $acct = "${FirstnameToUPN}." + $LastnameToUPN.Substring(0, $cnt)
    $cnt++
}

if (Get-ADUser -Filter "SamAccountName -eq '$acct'") {
    Write-Error "No unused account name found for ${firstname} ${lastname}."
}

您可以将所有现有用户名匹配项与所有可能的新用户名组合进行比较,而不是逐个检查每个可能的用户名直到找到匹配项

实际上,只需一次调用
Get ADUser
,即可完成整个操作:

# get existing accounts that could match using wildcard '$FirstnameToUPN*'
$existingAccounts = Get-ADUser -Filter "samaccountname -like '$FirstnameToUPN*'" -properties samAccountName | Select-Object -ExpandProperty samaccountname

# create all possible samaccountname combinations
$all_samaccountname = 0..($LastnamenameToUPN.Length) | % {$FirstnameToUPN + "." + $LastnamenameToUPN.substring(0, $_)}

# change first entry from "Firstname." to just "Firstname"
$all_samaccountname.Item(0) = $all_samaccountname.Item(0).TrimEnd('.')

# remove existing accounts from the possible samaccountname combinations
# then select the first available samaccountname match
$upn = $all_samaccountname | Where-Object { $existingAccounts -notcontains $_ } | Select-Object -First 1

# error if there's no matches and no username combination available
if (!($upn)) {
    Write-Error "No possible upn combinations available for: $firstname $lastname"
}

您可以将所有现有用户名匹配项与所有可能的新用户名组合进行比较,而不是逐个检查每个可能的用户名直到找到匹配项

实际上,只需一次调用
Get ADUser
,即可完成整个操作:

# get existing accounts that could match using wildcard '$FirstnameToUPN*'
$existingAccounts = Get-ADUser -Filter "samaccountname -like '$FirstnameToUPN*'" -properties samAccountName | Select-Object -ExpandProperty samaccountname

# create all possible samaccountname combinations
$all_samaccountname = 0..($LastnamenameToUPN.Length) | % {$FirstnameToUPN + "." + $LastnamenameToUPN.substring(0, $_)}

# change first entry from "Firstname." to just "Firstname"
$all_samaccountname.Item(0) = $all_samaccountname.Item(0).TrimEnd('.')

# remove existing accounts from the possible samaccountname combinations
# then select the first available samaccountname match
$upn = $all_samaccountname | Where-Object { $existingAccounts -notcontains $_ } | Select-Object -First 1

# error if there's no matches and no username combination available
if (!($upn)) {
    Write-Error "No possible upn combinations available for: $firstname $lastname"
}

附带的一点提示:在使用
get aduser$upn
时,您可以设置一个正确的过滤器:
get aduser-Filter{SamAccountName-eq$upn}
。如果用户不存在而不抛出错误,这将导致
$null
。更好的做法是尝试创建用户,并在“已存在”失败时捕获错误。然后,您可以将其放入一个循环中,并使用姓氏中的下一个字母持续递增计数器,直到它成功创建用户为止。@Paxz谢谢您。看起来效果不错。我很好奇是否有一种简单的方法可以像Ross Lyons所说的那样创建一个查找登录名的循环。附带的一点提示是:在使用
get aduser$upn
时,不要每次都试图捕捉错误,你只需设置一个正确的过滤器:
get aduser-Filter{SamAccountName-eq$upn}
。如果用户不存在而不抛出错误,这将导致
$null
。更好的做法是尝试创建用户,并在“已存在”失败时捕获错误。然后,您可以将其放入一个循环中,并使用姓氏中的下一个字母持续递增计数器,直到它成功创建用户为止。@Paxz谢谢您。看起来效果不错。我很好奇是否有一个简单的方法来创建一个查找登录名的循环,就像Ross Lyons说的那样。Ofc你必须在我点击post前3秒发布与我想的完全相同的答案。。拿我的票去他妈的…*从枪口喷出烟雾*Ofc你必须发布与我在投稿前3秒所想的完全相同的答案。。拿我的票去他妈的…*从枪口喷出烟*