这是我的方案,
我编写了一个SQL查询,该查询从我们的学生信息系统中提取具有空用户名的用户帐户。让我们假设这些是新入学的学生。然后,我想要在SQL查询中通过简单连接来完成此列表,其中包含一列建议的用户名。我想遍历该csv并检查以确保用户名在AD中已经存在,如果存在,则将下一个可用的号码附加到用户名。
所以在我的测试环境中,我有一个看起来像这样的csv。 (我把它做了测试)
StudentID,首先,最后,SuggestedUsername
12345,托尼,测试,testto
54321,托利,测试,testto
我的测试AD环境我已经有一个名为Tommy Test或Testto的学生,所以在这种情况下,我的powershell脚本应该告诉我Tony Test应该是testto1而Tolly Test应该是testto2。这有意义吗?
我的脚本的作品,它将读取csv,循环通过AD并返回testto1为csv的第1行,问题是它不会读取第2行,脚本结束
我一直在玩脚本中的数组,但这是我到目前为止所拥有的
Import-module Activedirectory
Add-Pssnapin Quest.ActiveRoles.admanagement
$useraccounts =@()
$useraccounts = import-Csv "Path\Test.csv"
$userbase = Get-QADuser -sizelimit 0 -SearchRoot 'mydomain.com/OU'
foreach ($user in $useraccounts) {
if ($userbase)
{
$userbase = $userbase | Select samaccountname | %{($_ -split "@")[0]}
$UserNumbers = @()
$userbase | % {
if ($_ -Match '\d+')
{
$UserNumbers += $matches[0]
}
}
$MaxUserNumber = ($userNumbers | Measure-Object -max).Maximum
$suggestedUserName = $user+($MaxUserNumber+1)
}
Else
{
$SuggestedUserName = $user
}
}
Write-Host $suggestedUserName
答案 0 :(得分:0)
好的,你的循环似乎没有循环,因为你没有使用字符串数组作为输出,你只是使用一个字符串,所以它只显示最后一个循环。但如果你喜欢我的解决方案,既不在这里也不在那里,因为我认为我有更好的选择。仅为了简单起见,请备份CSV,然后删除“建议的名称”列并对其进行运行。
$Users = Import-CSV "path\test.csv"
$Users|%{$_|Add-Member UserID ("$($_.last)$($_.first.substring(0,2))")}
$NameConflicts = $Users|group userid|?{$_.count -gt 1}
ForEach($Name in $NameConflicts){
$x=0
if(dsquery user -samid "$($name.name)*"){
$x = Get-ADUser -Filter {samaccountname -like "$($Name.Name)*"}|%{$_.samaccountname -replace "($($Name.name))(\d*)","`$2"}|sort -Descending |select -first 1
}
For($i=if($x -gt 0){0}else{1};$i -lt ($Name.count);$i++){
$Name.Group[$i].UserID = "$($Name.Name)$($i+$x)"
}
}
$Users|group userid|?{$_.count -eq 1}|%{if(dsquery user -samid "$($_.name)"){$_.Group[0].UserID = "$($_.Name)1"}}
$Users|FT -auto
加载您的列表,通过获取姓氏和名字的前两个字母来创建潜在的用户名。然后它按此分组,并找到任何一个有多个。然后,对于其中的每一个,它检查AD以查找具有该名称的任何现有帐户,并从名称末尾取出该数字,并选择最高的一个。然后,如果它发现任何已存在的,则重命名所有潜在的用户名以将下一个可用的数字附加到末尾(如果在AD中没有找到它将离开第一个,并重命名其余的数字)。最后,它检查所有其他名称,其中只有一个用户名,如果它在AD中,则它会在用户ID的末尾添加1。
这应该比你的脚本运行得更快,因为我只搜索需要检查的名称,并且它在提供程序级别进行过滤而不是取所有名称,然后通过PowerShell过滤