Проблема Powershell с определенной переменной

#powershell

#powershell

Вопрос:

Я довольно новичок в powershell, и у меня есть код, который я нашел. У меня это работало, но теперь это больше не работает. Я ничего не менял с переменной, поэтому я не уверен, что происходит. Вот ссылка на скриншот кода и ошибки. Пожалуйста, дайте мне знать, если вам нужна какая-либо другая информация

https://imgur.com/a/ntEhdoV

Спасибо!

 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)"
    }
}