Простой совет: простое пространство (или невидимый специальный символ) в вашем скрипте, прямо перед самым первым тегом <?php
, может вызвать это! Особенно, когда вы работаете в команде, а кто-то использует «слабую» IDE или перепутал файлы со странными текстовыми редакторами.
Я видел эти вещи;)
Ошибка возникает из-за того, что пользователь не указал действительное значение Identity
или, возможно, даже из-за того, что он не указал действительное значение MemberOf
.
Согласно документам , оба параметра хотят, чтобы с ними работали DistinguishedName
, ObjectGUID
, a SID
или SamAccountName
. По умолчанию этот командлет не генерирует никаких выходных данных, если вы не используете параметр -PassThru
.
В вашем случае, я думаю, вы пытаетесь использовать SamAccountName
, и это должно работать просто отлично. Однако проблема здесь заключается в том, что вы используете файл CSV.
При сохранении Excel в виде CSV-файла можно ожидать, что результатом будет файл с разделенными запятыми значениями, разделенными запятыми , как следует из названия CSV.
К сожалению, Excel использует текущую системную локаль для определения используемого разделителя. Например, на моем голландском компьютере в качестве разделителя будет использоваться точка с запятой ;
.
Если вы не проверите это, командлет Import-Csv
без параметра -Delimiter
примет запятую . Итак, после экспорта из Excel откройте файл csv с помощью Блокнота или любого другого текстового редактора, чтобы увидеть, что создано и какой символ-разделитель фактически используется. Вы также можете преодолеть эту проблему с помощью переключателя -UseCulture
в командлете Import-Csv
, но это будет иметь смысл только в том случае, если вы экспортируете из Excel и импортируете в PowerShell на том же компьютере (или, по крайней мере, тот, который использует ту же культуру )
То, что вы ДОЛЖНЫ иметь, это действительный файл CSV, что-то вроде этого:
"UserName","Group"
"user1","group1"
"user2","group1"
"user3","group1"
Так как созданный вами вручную CSV имеет пустые значения для столбца UserName
, вас это не удивляет получаю ошибку.
Затем, с еще несколькими изменениями в вашем коде, это должно сработать:
Import-Module ActiveDirectory
# assuming the CSV uses commas as delimiter character. Otherwise, specify -Delimiter parameter
$list = Import-csv "\\ca23fs1\IT\Scripts\Active Directory\New-Hire\Account Setup\Users-Groups.csv"
foreach ($item in $list) {
# if you are not sure the CSV actually contains valid data to work with, check it here first:
if ([string]::IsNullOrWhiteSpace($item.UserName) -or [string]::IsNullOrWhiteSpace($item.Group)) {
Write-Warning "Empty entry found in the CSV file"
}
else {
Add-ADPrincipalGroupMembership -Identity $item.UserName -MemberOf $item.Group -Whatif
# The DriveLetter must be a single, uppercase letter and the colon is required.
Set-ADUser -Identity $item.UserName -HomeDirectory "Path" -HomeDrive 'H:' -WhatIf
}
}
Надежда, которая помогает
$ item не заполнен. Вы утверждаете, что $ users = $ item.username, но $ item в этот момент равен нулю.
Попробуйте:
$list = Import-csv "PATH"
ForEach ($item in $list) {
$users = $item.Username
$groups = $item.Group
Add-ADPrincipalGroupMembership -Identity $users -MemberOf $groups -Whatif |
Set-ADUser $users -HomeDirectory "Path" -Homedrive H -WhatIf
}
Это в основном говорит: Для каждого элемента в списке используйте синтаксис .username и .group, чтобы заполнить переменную users и groups. Затем выполните команды Add и Set. Помните, что это цикл, который запускается один раз для каждого элемента $ в списке $.
Тестовый код:
$list = Import-csv "PATH"
ForEach ($item in $list) {
$user = $item.Username
$group = $item.Group
Write-Host "$user is in $group"
}