繁体   English   中英

Powershell 定义变量的问题

[英]Powershell issue with a defined variable

我对 powershell 很陌生,并且找到了一个代码。 我让它工作,但现在它不再工作了。 我没有对变量进行任何更改,所以我不确定发生了什么。 这是代码和错误的屏幕截图的链接。 如果您需要任何其他信息,请告诉我

https://imgur.com/a/ntEhdoV

谢谢!

Import-Module activedirectory
 
$ADUsers = Import-csv 'C:\Users\Desktop\Powershell files\EM-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:\Users\jcarnovale\Desktop\Testing 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

在继续执行脚本之前,您可能想检查您是否有一个好的用户名,例如:

$Username   = $User.username
...
if(!$Username) {
   throw "Username was empty!"
}

此外,尝试更改 Get-ADUser 过滤器以使用字符串:

if (Get-ADUser -F "SamAccountName -eq $Username")
{

}

您没有向我们展示任何导入的 CSV 文件本身,我认为主要问题在那里。

默认情况下, Import-Csv期望逗号 ( , ) 用作分隔符。 如果您的文件中不是这种情况,您需要添加参数-Delimiter后跟在文件中用作分隔符的字符(如-Delimiter ';'如果您的文件使用分号)。
请先检查,以便 Import-Csv cmdlet 可以正确解析文件。

接下来,可能是username名列中有空值,如果是这样,代码应该跳过这些行。

此外,正如所评论的, -Filter参数需要一个双引号字符串"Property -eq 'something'" ,其中扩展了 $username 之类的变量,而不是 scriptblock {..}

最后,我建议在具有许多属性的 cmdlet 上使用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:\Users\Desktop\Powershell files\EM-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)"
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM