Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 新员工脚本问题_Powershell - Fatal编程技术网

Powershell 新员工脚本问题

Powershell 新员工脚本问题,powershell,Powershell,我编写了一个脚本,它从CSV文件中获取信息,并根据列中的变量创建一个AD帐户和一个MSOL帐户。该脚本只与我测试的一个用户一起工作 $AccountList = import-csv "C:\File\path\input.csv" ForEach ($Person in $AccountList) { $Accountname = $firstname.Trim().ToLower() + "." + $lastname.Trim().ToLower() $Firstname

我编写了一个脚本,它从CSV文件中获取信息,并根据列中的变量创建一个AD帐户和一个MSOL帐户。该脚本只与我测试的一个用户一起工作

$AccountList = import-csv "C:\File\path\input.csv"

ForEach ($Person in $AccountList) {
    $Accountname = $firstname.Trim().ToLower() + "." + $lastname.Trim().ToLower()
    $Firstname = $AccountList.pFirstName
    $LastName = $AccountList.pLastName
    $UPN = $Accountname + "@company.com"
    $displayname = $firstname + " " + $Lastname
    $Department = $AccountList.pDepartment
    $Location = $AccountList.pLocation|

    ForEach {
        New-ADUser -SamAccountName $Accountname -Name $displayname -DisplayName $displayname -Surname $Lastname -GivenName $Firstname -UserPrincipalName $UPN -Department $Department -Office $Location -AccountPassword (ConvertTo-SecureString -AsPlainText "X" -Force) -ChangePasswordAtLogon $true -Enabled $true -PasswordNeverExpires $false -Path "CN=Users,DC=medsinmotion,DC=local"
    }
    ForEach ($Person in $AccountList) {
        New-MsolUser -DisplayName $displayname -FirstName $Firstname -LastName $Lastname -UserPrincipalName $UPN -Department $Department  -UsageLocation US -LicenseAssignment reseller-account:DESKLESSPACK -ForceChangePassword $true

        if ($Department -match "Call Center" -or "Retail") {
            Add-MailboxPermission -Identity CallCenter -User $Accountname -AccessRights FullAccess
            Add-DistributionGroupMember -Identity callctr@company.com -Member $Accountname
        }
        Else { 
            Set-MsolUserLicense -UserPrincipalname $UPN -AddLicenses O365_BUSINESS_PREMIUM -RemoveLicenses reseller-account:DESKLESSPACK
        }
        Add-DistributionGroupMember -Identity all -Member $UPN
    }
}
问题是,当有2个以上的用户时,我试图设置的所有变量都会出现错误;错误是:

“无法将”“System.Object[]”转换为参数”“SamAccountName”“所需的类型”“System.String”“。不支持指定的方法”

它会遍历所有变量(
Displayname
Samaccountname
,和
UPN
),但会出现该错误

导入Csv的
-Raw
获取内容的
不同

有没有办法将其转换为系统字符串?请告诉我可能的解决方案


*不得不重做

正如@boxdog在评论中提到的,第一个也是最主要的问题是,您正在循环使用
$AccountList
,每个元素都是
$Person
。因此,如果需要当前元素,应该使用
$person

第二个问题是在定义
$AccountName
之前,使用
$firstname
$lastname
定义
$AccountName

第三,您只是将$AccountList.pLocation
导入另一个循环

第四,
$Department-match“Call Center”-或“Retail”
始终为真,因为
$Department-match“Call Center”
“Retail”
是单独的条件,当字符串
Retail
被转换为布尔值时,因为它不是空的,所以始终为真
|
是正则表达式或运算符,否则您需要在
-或
之后使用另一个
-match
语句

通过利用在哈希表中定义参数,然后将哈希表作为命令的参数传递,也可以大大简化脚本

$AccountList = import-csv "C:\File\path\input.csv"

ForEach ($Person in $AccountList) {

    $NewUserParams = @{
        GivenName = $Person.pFirstName
        Surname = $Person.pLastName
        SamAccountName = "$($Person.pFirstName.Trim().ToLower()).$($Person.pLastName.Trim().ToLower())"
        UserPrincipalName = "$($Person.pFirstName.Trim().ToLower()).$($Person.pLastName.Trim().ToLower())@company.com"
        Name = "$($Person.pFirstName) $($Person.pLastName)"
        DisplayName = "$($Person.pFirstName) $($Person.pLastName)"
        Department = $Person.pDepartment
        Office = $Person.pLocation
        AccountPassword =  (ConvertTo- SecureString -AsPlainText "X" -Force)
        ChangePasswordAtLogon = $True
        Enabled = $True
        PasswordNeverExpires = $False
        Path = "CN=Users,DC=medsinmotion,DC=local"
    }

    New-ADUser @NewUserParams

    $NewMsolUserParams = @{
        FirstName = $NewUserParams.GivenName
        LastName = $NewUserParams.Surname
        UserPrincipalName = $NewUserParams.UserPrincipalName
        DisplayName = $NewUserParams.displayname
        Department = $NewUserParams.Department
        UsageLocation = 'US'
        LicenseAssignment =  'reseller-account:DESKLESSPACK'
        ForceChangePassword = $True
    }

    New-MsolUser @NewMsolUserParams

    if ($NewMsolUserParams.Department -match "Call Center|Retail") {
        Add-MailboxPermission -Identity CallCenter -User $NewUserParams.SamAccountName -AccessRights FullAccess
        Add-DistributionGroupMember -Identity callctr@company.com -Member $NewUserParams.SamAccountName
    } Else { 
        Set-MsolUserLicense -UserPrincipalname $NewUserParams.UserPrincipalName -AddLicenses O365_BUSINESS_PREMIUM -RemoveLicenses reseller-account:DESKLESSPACK
    }
    Add-DistributionGroupMember -Identity all -Member $NewUserParams.UserPrincipalName 
}

至少有一个问题(可能还有更多问题)是您在不同的地方引用了
$AccountList
,您应该在这些地方引用
$Person
。例如:
$Firstname=$AccountList.pFirstName
,应该是
$Firstname=$Person.pFirstName
好的,谢谢,我必须尝试一下。我很感谢你的评论,这很酷,我不知道它的存在,但我必须尝试一下。谢谢你的建议。这可以工作并创建帐户,但它不会将所有用户添加到特定的邮箱和DL中;它只添加列表中的最后一个成员。是否有一种方法可以将所有用户同时添加到列表中?检查是否对任何额外的右大括号进行了修改
}
。邮箱部分应该位于
foreach
循环中,并针对每个用户运行。既不使用数组,也不使用数组,因此您确实需要为循环中的每个用户运行一次。