我正在尝试编写一个脚本,但它在创建所有 OU 后就停止工作了。所有 OU 都创建得很完美,只是没有创建用户和组,这反过来又没有将用户添加到指定的组中。
我尝试自己解决这个问题,但似乎找不到脚本中的缺陷。
# import required modules
Import-Module ActiveDirectory
# Set Password
$password = ConvertTo-SecureString "W@chtw00rd" -AsPlainText -Force
#Set FilePath
$filepath = "C:\Users\Administrator\Desktop\Lijst met Medewerkers FitNu.csv"
# Import file into variable
$users = Import-Csv $filepath
# Loop through rows, set variables and make new users
ForEach ($user in $users) {
$fname = $user.'Voornaam'
$surname = $user.'Achternaam'
$jtitle = $user.'Functie'
$officephone = $user.'Telefoon'
$office = $user.'Locatie'
$department = $user.'Afdeling'
$OUpath = $user.'Organizational Unit'
$title = $user.'Functie'
$location = $user.'Locatie'
# Make OU's
New-ADOrganizationalUnit -Name "Asgard" -Path "DC=Asgard,DC=com" -ProtectedFromAccidentalDeletion $false
New-ADOrganizationalUnit -Name "$location" -Path "OU=Asgard,DC=Asgard,DC=com" -ProtectedFromAccidentalDeletion $false
New-ADOrganizationalUnit -Name "$department" -Path "OU=$location,OU=Asgard,DC=Asgard,DC=com" -ProtectedFromAccidentalDeletion $false
New-ADOrganizationalUnit -Name "DomainLocal" -Path "OU=$location,OU=Asgard,DC=Asgard,DC=com" -ProtectedFromAccidentalDeletion $false
# Make Users
New-ADUser -Name "$fname" -GivenName "$fname" -UserPrincipalName "$fname $surname" -Surname "$surname" -Path "OU=$location,OU=$department,OU=Asgard,DC=Asgard,DC=com" -ProfilePath "\\Thor\UserProfiles\$fname" -Homedrive "D" -Homedirectory "\\Thor\UserData\$fname" -AccountPassword $password -OfficePhone "+31$officephone" -Office "$office" -Department "$department" -Title "$title" -PasswordNeverExpires $True -ChangePasswordAtLogon $False -Enabled $True
# Make Groups
$globalgroup = "GG_"+"$department"+"_"+"$location[0]"
New-ADGroup -Name $globalgroup -GroupCategory Security -GroupScope Global -Path "OU=$location,OU=$department,OU=Asgard,DC=Asgard,DC=com"
$domaingroupr = "DL_"+"$department"+"_"+"$location[0]"+"_R"
New-ADGroup -Name $domaingroupr -Groupcategory Security -GroupScope DomainLocal -Path "OU=$location,OU=DomainLocal,DC=Asgard,DC=com"
$domaingrouprw = "DL_"+"$deparment"+"_"+"$location[0]"+"_RW"
New-ADGroup -Name $domaingrouprw -Groupcategory Security -Groupscope DomainLocal -Path "OU=$location,OU=DomainLocal,DC=Asgard,DC=com"
# Add Users to group
Add-ADGroupMember -Identity $globalgroup -Members $user
}
答案1
你的问题在这里:
-UserPrincipalName "$fname $surname"
用户主体名称应为username@domain
,因此不能包含空格。由于无效,因此显示未找到身份。我在脚本的任何地方都看不到任何用户名构造,所以这是您的下一步。虽然可能只可以在此处设置用户名,但请确保它不包含空格。句点是可以接受的,但最好是用户名@域。
-UserPrincipalName
指定格式为 的用户主体名称 (UPN) <user>@<DNS-domain-name>
。UPN 是由管理员分配的友好名称,比系统使用的 LDAP 可分辨名称更短且更容易记住。UPN 独立于用户对象的可分辨名称,因此可以移动或重命名用户对象而不会影响用户登录名。使用 UPN 登录时,用户不再需要从登录对话框的列表中选择域。
来源:https://docs.microsoft.com/en-us/.../new-aduser?view=windowsserver2019-ps
答案2
以值(数组)Add-AdGroupMember
作为其参数。这些值必须是-Member
用户DistinguishedName
、、或对象。ObjectGUID
ObjectSID
SamAccountName
Microsoft.ActiveDirectory.Management.ADUser
你正在向它提供$user
CSV 中的对象,其中包含没有任何这些属性。实现方法是将 cmdlet 的结果捕获New-ADUser
到变量中,并将该对象(或上面提到的该对象中的一个属性)用作参数-Member
。
此外,我强烈建议使用 Splatting 参数,这样您就不必创建那些很容易出错的可怕的长代码行。
尝试:
$userParams = @{
# you forgot this one
SamAccountName = $user.Achternaam
# and UserPrincipalName must have format: username@domain name (UPN suffix)
UserPrincipalName = '{0}@asgard.com' -f $user.Achternaam
Name = '{0} {1}' -f $user.Voornaam, $user.Achternaam
GivenName = $user.Voornaam
Surname = $user.Achternaam
AccountPassword = $password
ProfilePath = '\\Thor\UserProfiles\{0}' -f $user.Achternaam
Path = 'OU={0},OU={1},OU=Asgard,DC=Asgard,DC=com' -f $user.Locatie, $user.Afdeling
Homedrive = 'D'
Homedirectory = '\\Thor\UserData\{0}' -f $user.Achternaam
OfficePhone = '+31{0}'-f $user.Telefoon
Office = $user.Locatie
Department = $user.Afdeling
Title = $user.Functie
PasswordNeverExpires = $True
ChangePasswordAtLogon = $False
Enabled = $True
}
$ADUser = New-ADUser @userParams -PassThru # use PassThru to capture the newly created user
现在您有一个 ADUser 对象,您可以在 Add-ADGroupMember 行上使用它:
Add-ADGroupMember -Identity $globalgroup -Members $ADUser
PS 还建议首先检查域中是否已存在具有该 SamAccountName 的用户,如果是,则输出警告并跳过该用户。为此使用:
foreach ($user in $users) {
$ADUSer = Get-ADUser -Filter "SamAccountName -eq '$($user.Achternaam)'" -ErrorAction SilentlyContinue
if ($ADUser) {
Write-Warning "A user '$($user.Achternaam)' already exists in the domain"
continue # skip this user and proceed with the next one
}
# here the rest of the code
}
哦,是的,失败的原因New-ADUser
是:
- 您没有指定(必填)SamAccountName
- UserPrincipalName 在语法上是错误的(参见内联注释)