首页 > 解决方案 > Office365 - 同时删除多个许可证无法按预期工作

问题描述

我正在编写一个连接 O365 环境并删除许可证的脚本。

现在我需要删除多个不再与用户相关的许可证。并且此类许可证的列表将出现在字符串变量中。

如果我事先知道许可证的名称,这就是命令的外观:

Set-MsolUserLicense -UserPrincipalName "ID_TestB@lic.com" -RemoveLicenses "liconline:DESKLESSPACK","liconline:OFFICESUBSCRIPTION";

上面的命令将删除两个许可证,即desklesspack和officesubscription,用于ID_TestB@lic.com(注意每个许可证名称中的双引号

但这不是事情的样子,因为我想让它动态化,我将把许可证直接传递给一个变量

所以现在如果我在一个变量中捕获这些许可证,假设是 $license,其中 $license 是

$license="`"liconline:DESKLESSPACK`",`"liconline:OFFICESUBSCRIPTION`""

反引号是 powershell 中的转义字符,所以我正在转义双引号,这应该是反引号文本的一部分

现在如果我用这个

Set-MsolUserLicense -UserPrincipalName "ID_TestB@lic.com" -RemoveLicenses $license;

这给我一个错误

Set-MsolUserLicense :无法分配此许可证,因为它无效。使用 Get-MsolAccountSku cmdlet 检索有效许可证的列表。

我也尝试过这样做:

$license1 = "liconline:DESKLESSPACK";
$license2 = "liconline:OFFICESUBSCRIPTION";
Set-MsolUserLicense -UserPrincipalName "ID_TestB@licent.com" -RemoveLicenses $license1, $license2;

这有效。

同样,这不是一种动态方法,因为它可能会发生两个以上的许可证。

如果有人知道这可以起作用,请提供帮助。此外,我不想拆分字符串并通过 for 循环进行迭代

标签: powershelloffice365

解决方案


看来我做错了。

在使用 -RemoveLicenses 开关 Powershell 需要一个字符串数组而不是字符串时,我将逗号分隔的双引号解释为导致问题的字符串。

所以解决方案是:

$license="licentonline:DESKLESSPACK","licentonline:OFFICESUBSCRIPTION"
#powershell will automatically convert above string to an array
Set-MsolUserLicense -UserPrincipalName "ID_TestB@licent.com" -RemoveLicenses $license;

推荐阅读