无法使用 powershell 设置 O365 许可证

Unable to set up O365 license with powershell

我正在尝试使用 powershell 在 Office365 用户上设置许可证以供将来迁移。

为此,我首先将现有 users/licences 的列表(带有 powershell 脚本)放入 CSV 文件中。它看起来像这样:

Users,Licence
toto@mycompany.com,"MYCOMPANY:LICENCEXXX","MYCOMPANY:LICENCEVISIO"
titi@mycompany.com,"MYCOMPANY:LICENCEXXX","MYCOMPANY:LICENCEWORD"
tata@mycompany.com,"MYCOMPANY:LICENCEXXX","MYCOMPANY:LICENCEEXCEL"
....

(有关信息,我确定许可证名称,因为我使用命令 Get-MsolAccountSku 获得了它们)

为了迁移的未来,我目前正在执行另一个脚本,通过获取有关 Licence 的信息,自动为现有用户设置许可证 CSV 文件的列

我是这样做的:

$csv = Import-Csv C:\output.csv

$toto = $csv[1].Licence

Set-MsolUserLicense -UserPrincipalName toto@mycompany.com -AddLicenses $toto

这是我的问题,当我启动这个脚本时出现了这个错误:

Set-MsolUserLicense : Unable to assign this license because it is invalid. Use the Get-MsolAccountSku cmdlet to retrieve a list of valid licenses.
Au caractère Ligne:1 : 1
+ Set-MsolUserLicense -UserPrincipalName toto@mycompany.com -AddLicense ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OperationStopped: (:) [Set-MsolUserLicense], MicrosoftOnlineException
    + FullyQualifiedErrorId : Microsoft.Online.Administration.Automation.InvalidUserLicenseException,Microsoft.Online.Administration.Automation.SetUserLicense

看起来许可证不存在,但如果我手动执行命令,它会起作用。

此外,如果我像在脚本中那样放置变量 $toto,它会起作用:

$toto = "MYCOMPANY:LICENCEXXX","MYCOMPANY:LICENCEWORD"

我不明白为什么当我手动执行时它会起作用,如果我从 CSV 文件中提取它就不起作用。

希望你能帮助我, 谢谢

假设以下代码按要求执行:

$toto = "MYCOMPANY:LICENCEXXX","MYCOMPANY:LICENCEWORD"
Set-MsolUserLicense -UserPrincipalName toto@mycompany.com -AddLicenses $toto

$toto 是两个字符串的数组。每个字符串都是一个许可证名称。请参阅下面的输出:

$toto

输出:

MYCOMPANY:LICENCEXXX
MYCOMPANY:LICENCEWORD

为了 -AddLicenses 向每个 CSV 行传递两个许可证名称的数组,必须调整您的 CSV 示例。这是因为您的 header 行有两个 comma-separated 值。每个后续数据行都有三个 comma-separated 值。因此,您需要添加第三个 header 或将第二个和第三个数据字段(两个许可证名称)合并到一个字段中。 Import-Csv 期望 header 计数与每一行的数据字段计数完美对齐。

我们将尝试将许可证合并到一个字段中,并注意报价中的细微差别,因为我们引用的是整个字段而不是每个单独的许可证。此过程称为限定文本。

$csv = @'
Users,Licence
toto@mycompany.com,"MYCOMPANY:LICENCEXXX,MYCOMPANY:LICENCEVISIO"
titi@mycompany.com,"MYCOMPANY:LICENCEXXX,MYCOMPANY:LICENCEWORD"
tata@mycompany.com,"MYCOMPANY:LICENCEXXX,MYCOMPANY:LICENCEEXCEL"
'@

$csv | ConvertFrom-Csv | Foreach-Object {
    Set-MsolUserLicense -UserPrincipalName $_.Users -AddLicenses $_.Licence.Split(',')
}

$_ 是由 Foreach-Object 处理的当前 object(本例中的行)。 $_.Licence.Split(',') 通过在 , 字符处拆分许可证数据来创建两个许可证字符串的数组。请注意,这里使用 ConvertFrom-Csv 只是因为我将 CSV 数据作为字符串而不是来自文件来处理。如果从文件中读取,您只需使用 Import-Csv file.csv | Foreach-Object {.