#powershell
#powershell
Вопрос:
Я довольно новичок в powershell, и у меня есть код, который я нашел. У меня это работало, но теперь это больше не работает. Я ничего не менял с переменной, поэтому я не уверен, что происходит. Вот ссылка на скриншот кода и ошибки. Пожалуйста, дайте мне знать, если вам нужна какая-либо другая информация
Спасибо!
Import-Module activedirectory
$ADUsers = Import-csv 'C:UsersDesktopPowershell filesEM-mis-new-AD.csv'
foreach ($User in $ADUsers)
{
$Username = $User.username
$Password = $User.password
$Firstname = $User.firstname
$Lastname = $User.lastname
$OU = $User.ou
$Password = $User.Password
if (Get-ADUser -F {SamAccountName -eq $Username})
{
Write-Warning "A user account with username $Username already exist in Active Directory."
}
else
{
New-ADUser `
-SamAccountName $Username `
-UserPrincipalName "$Username@Mydomain" `
-Name "$Firstname $Lastname" `
-GivenName $Firstname `
-Surname $Lastname `
-Enabled $True `
-DisplayName "$Firstname, $Lastname" `
-Path $OU `
-AccountPassword (convertto-securestring $Password -AsPlainText -Force) -ChangePasswordAtLogon $True
}
}
Ошибка:
Get-ADUser : Variable: 'Username' found in expression: $Username is not defined.
At C:UsersjcarnovaleDesktopTesting if.ps1:22 char:6
if (Get-ADUser -F {SamAccountName -eq $Username})
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CategoryInfo : InvalidArgument: (:) [Get-ADUser], ArgumentException
FullyQualifiedErrorId : ActiveDirectoryCmdlet:System.ArgumentException,Microsoft.ActiveDirectory.Management.Commands.GetADUse
Комментарии:
1. Пожалуйста, опубликуйте фактический код, с которым вам нужна помощь (вместо его скриншота)
2. Я отредактировал сообщение, чтобы в нем был код и код ошибки
3. Попробуйте
Get-ADUser -Filter "SamAccountName -eq '$Username'"
Ответ №1:
Вероятно, вы захотите проверить, что у вас правильное имя пользователя, прежде чем продолжить работу в скрипте, например:
$Username = $User.username
...
if(!$Username) {
throw "Username was empty!"
}
Кроме того, попробуйте изменить фильтр Get-ADUser, чтобы использовать строку:
if (Get-ADUser -F "SamAccountName -eq $Username")
{
}
Ответ №2:
Вы не показали нам ничего из самого импортированного CSV-файла, и я думаю, что основная проблема именно в этом.
Import-Csv
по умолчанию ожидается, что в качестве символа-разделителя будет использоваться запятая ( ,
). Если в вашем файле это не так, вам необходимо добавить параметр, за которым -Delimiter
следует символ, используемый в качестве разделителя в вашем файле (например, -Delimiter ';'
если в вашем файле используется точка с запятой).
Пожалуйста, сначала проверьте это, чтобы командлет Import-Csv мог правильно проанализировать файл.
Далее, возможно, в username
столбце есть пустые значения, и если это так, код должен пропустить эти строки.
Также, как указано, для -Filter
параметра требуется строка "Property -eq 'something'"
в двойных кавычках, в которой вместо scriptblock расширяется переменная типа $username {..}
Наконец, я бы рекомендовал использовать Splatting для командлетов, которые принимают много свойств, вместо использования обратных ссылок.
Попробуйте
Import-Module ActiveDirectory
# this defaults to csv fields delimited by a comma. If your CSV file uses a different
# character, then add parameter '-Delimiter' followed by the actual character
$ADUsers = Import-Csv -Path 'C:UsersDesktopPowershell filesEM-mis-new-AD.csv'
# the Where-Object clause is just a precaution to omit records that have no username value
$ADUsers | Where-Object { $_.username -match 'S'} | ForEach-Object {
$Username = $_.username
if (Get-ADUser -Filter "SamAccountName -eq '$Username'" -ErrorAction SilentlyContinue) {
Write-Warning "A user account with SamAccountName '$Username' already exist in Active Directory."
}
else {
$Firstname = $_.firstname
$Lastname = $_.lastname
# use splatting on cmdlets that use a lot of parameters
$userParams = @{
SamAccountName = $Username
UserPrincipalName = "$Username@Mydomain.com"
Name = "$Firstname $Lastname"
GivenName = $Firstname
Surname = $Lastname
Enabled = $true
DisplayName = "$Firstname, $Lastname"
Path = $_.ou
AccountPassword = (ConvertTo-SecureString $_.Password -AsPlainText -Force)
ChangePasswordAtLogon = $true
}
# create the user and report back
New-ADUser @userParams
Write-Host "Created new user '$Username' with initial password: $($_.Password)"
}
}