用于在PowerShell中生成samaccountname的函数
我正在尝试编写一个PS函数,它可以以一种特定的方式生成SamAccountName,我发现了另一个问题,但它与我试图做的不一样。 我需要像这样生成SamAccountName:用于在PowerShell中生成samaccountname的函数,powershell,active-directory,Powershell,Active Directory,我正在尝试编写一个PS函数,它可以以一种特定的方式生成SamAccountName,我发现了另一个问题,但它与我试图做的不一样。 我需要像这样生成SamAccountName: UNIT+firstName的首字母+lastName的首字母 例如,单位FLN中的员工Jane Doe可以将FLNjd设置为SamAccountName,函数应检查该ID是否由其他用户使用,如果为真,则SamAccountName应为: UNIT+firstName的首字母+firstName的首字母两个首字母如FLN
UNIT+firstName的首字母+lastName的首字母
例如,单位FLN中的员工Jane Doe可以将FLNjd设置为SamAccountName,函数应检查该ID
是否由其他用户使用,如果为真,则SamAccountName应为:
UNIT+firstName的首字母+firstName的首字母两个首字母
如FLNjdo
如果也采用该方法,则SamAccountName应为:
UNIT+firstName的首字母首字母首字母首字母首字母首字母首字母首字母首字母首字母首字母首字母首字母首字母首字母首字母首字母首字母首字母首字母首字母首字母首字母首字母首字母首字母首字母首字母首字母首字母首字母首字母首字母首字母首字母首字母首字母首字母首字母首字母首字母首字母首字母首字母首字母
如果也采用该方法,则SamAccountName应为:
UNIT+firstName的首字母缩写+firstName的首字母缩写+1
如FLNjado1
从这里开始添加数字2、3、4….
,只要函数发现ID
存在
我只提取了所需的首字母:
$first_of_fname = ($_.Fname).Substring(0,1).ToLower()
$first_of_lname = ($_.Lname).Substring(0,1).ToLower()
$FirstandSecond_of_fname = ($_.Fname).Substring(0,2).ToLower()
$FirstandSecond_of_lname = ($_.Lname).Substring(0,2).ToLower()
我现在需要知道如何以上述形式和顺序生成SamAccountName
非常感谢您的帮助。您可以执行以下操作:
Function Get-SamAccountName {
Param(
[Parameter(Position=0,ValueFromPipelineByPropertyName)]
$Unit,
[Parameter(Position=1,ValueFromPipelineByPropertyName)]
$First,
[Parameter(Position=2,ValueFromPipelineByPropertyName)]
$Last
)
$fcount = 1
$lcount = 1
$inc = 1
$Sam = "{0}{1}{2}" -f $unit,$first.substring(0,$fcount).ToLower(),$last.substring(0,$lcount++).ToLower()
while (Get-AdUser -Filter "SamAccountName -eq '$Sam'") {
if ($fcount -le 2) {
$Sam = "{0}{1}{2}" -f $unit,$first.substring(0,$fcount++).ToLower(),$last.substring(0,$lcount).ToLower()
} else {
$Sam = "{0}{1}{2}{3}" -f $unit,$first.substring(0,2).ToLower(),$last.substring(0,2).ToLower(),$inc++
}
}
$Sam
}
使用选项1:使用命名参数
Get-SamAccountName -Unit 'FLN' -First 'Sam' -Last 'Wise'
$users = Get-Content users.txt
$users
FLN,Sam,Wise
HRS,John,Doe
COM,Jane,Doe
$users | ConvertFrom-Csv -Header 'Unit','First','Last' | Foreach {
$_ | Get-SamAccountName
}
使用选项2:使用位置参数(未命名)
使用选项3:具有单位和名称的文本列表
Get-SamAccountName -Unit 'FLN' -First 'Sam' -Last 'Wise'
$users = Get-Content users.txt
$users
FLN,Sam,Wise
HRS,John,Doe
COM,Jane,Doe
$users | ConvertFrom-Csv -Header 'Unit','First','Last' | Foreach {
$_ | Get-SamAccountName
}
如果您的文件已经是具有正确标题的Csv,则可以在此处跳过从Csv转换到的管道
说明:
函数返回一个字符串,该字符串表示可用的SamAccountName
值
$fcount
是我们要检索的名字字符计数$lcount
是我们要检索的姓氏字符数$inc
是我们希望在需要时附加到用户名的数字
$var++
符号在执行$var
行后,将其值增加一个。$fcount++
和$lcount++
的计时允许我们从(第一个、最后一个)中检索(1,1)、(1,2)、(2,2)个字符,同时最小化代码<在检索当前的$inc
值后,code>$inc++
将递增
-f
是字符串
只有找到当前创建的SamAccountName
值,才会执行while
循环
注意:代码缩短的复杂性可能值得,也可能不值得。从性能的角度来看,它没有什么好处,但我确实觉得这一级别的代码复杂性只是相对的。要采取不同的方法,而不是使用多个if语句,您可以使用开关语句“向后”来找出$null
是什么或不可用,然后返回默认开关,它是最终的,同时
迭代循环递增计数
#Get substrings
$first_of_fname = ($_.Fname).Substring(0,1).ToLower()
$first_of_lname = ($_.Lname).Substring(0,1).ToLower()
$FirstandSecond_of_fname = ($_.Fname).Substring(0,2).ToLower()
$FirstandSecond_of_lname = ($_.Lname).Substring(0,2).ToLower()
#create patters to match on
$pattern1 = $UNIT + $first_of_fname + $first_of_lname
$pattern2 = $UNIT + $first_of_fname + $FirstandSecond_of_lname
$pattern3 = $UNIT + $FirstandSecond_of_fname + $FirstandSecond_of_lname
#evaluate what is available
switch($null){
(Get-ADUser -Filter "samAccountName -like '$pattern1'"){
Write-Host "$pattern1 - Free"
break
}
(Get-ADUser -Filter "samAccountName -like '$pattern2'"){
Write-Host "$pattern2 - Free"
break
}
(Get-ADUser -Filter "samAccountName -like '$pattern3'"){
Write-Host "$pattern3 - Free"
break
}
default {
$cnt = 1
while (Get-ADUser -Filter "SamAccountName -like '$pattern3$cnt'") {
$cnt++
}
Write-Host "$pattern3$cnt - Free"
break
}
}
你已经有了逻辑。。不幸的是,你需要做一些和别人做的相似的事情。许多if-else语句将继续生成,直到最后找到数字。然后您可能可以查找使用过的数字+1管理信息,我将测试它并让您知道,谢谢。