使用 Windows Azure Active Directory 管理 Office 365

 

上次修改主題的時間: 2015-03-09

摘要:使用 Windows PowerShell,以使用 Windows PowerShell Cmdlet、指令碼和批次程序來管理 Office 365。

您是對的:當您看到 "Azure Active Directory" 這個字詞時,您的第一個想法可能不是「我確信這是您使用 Windows PowerShell 管理 Office 365 的方式。」。不過,如果是這樣,則 "Azure" 會是 Microsoft 雲端服務的名稱,而 "Active Directory" 會是 Active Directory 的名稱。請將它們放在一起,並取得 Azure Active Directory Directory,這是一種技術可讓您使用 Windows PowerShell 來管理 Office 365 使用者、群組、授權和訂閱。本主題包括下列相關資訊:

  • 傳回 Office 365 使用者帳戶資訊

  • 選取要傳回的使用者帳戶屬性值

  • 設定使用者帳戶屬性值

  • 使用 Office 365 使用者授權

  • 與位置參數和 Office 365 相關的備註

如果您想要更多的 Azure Active Directory 指令程式資訊,則可以在這裡找到該資訊。

更有趣 (重要) 的是聚焦於可使用 Azure Active Directory 執行的管理工作。Azure Active Directory 包括 66 個指令程式,其中大部分是用來管理 Office 365 使用者、群組和授權。例如,需要 Office 365 使用者的快速清單嗎?請嘗試此命令:

Get-MsolUser

雖然這有點迂迴,但是可能是談論指令程式名稱的不錯時機。如果您查看 Azure Active Directory 指令程式的名稱,則會注意到它們共有一個項目:

  • Add-MsolForeignGroupToRole

  • Add-MsolGroupMember

  • Add-MsolRoleMember

  • Confirm-MsolDomain

  • Connect-MsolService

誠如所見,每個指令程式名詞 (連字號後面的名稱的部分) 的開頭都是前置詞 Msol。這是巧合嗎?不完全是。而是,Msol 前置碼 (MsOnline 的簡寫) 用來將這些指令程式識別為 Azure Active Directory 指令程式。所有 Azure Active Directory 指令程式都必須使用前置碼 Msol,而且沒有其他 Windows PowerShell 指令程式可以使用 Msol 前置碼。例如,SharePoint Online 指令程式都會有前置碼:

  • Add-SPOUser

  • Connect-SPOService

  • Disconnect-SPOService

  • Get-SPOAppErrors

  • Get-SPOAppInfo

Lync Online Cmdlet 都會使用前置碼 Cs:

  • Get-CsAudioConferencingProvider

  • Get-CsOnlineUser

  • Get-CsTenant

  • Get-CsTenantFederationConfiguration

  • Get-CsTenantHybridConfiguration

Cs 前置碼實際上是 Communication Server 的簡寫。原因是 Lync Server 之前稱為 Office Communications Server。正式變更名稱時,即已完成大量指令程式。因為稍後變更 Cmdlet 名稱可能會延遲產品的發行,所以已決定保留 Cs 前置碼。

有趣的是,Exchange Cmdlet 未使用任何類型的前置碼:

  • Add-RecipientPermission

  • Get-LinkedUser

  • Get-RecipientPermission

  • Get-RemovedMailbox

  • Get-SendAddress

為什麼?Exchange 是第一個發行一組 Windows PowerShell 指令程式的伺服器產品。在當時,沒有項目會強制執行使用指令程式前置碼或其他識別碼。不過,其他伺服器團隊開始建立指令程式時,很快會發現出現問題:如果 Exchange 的指令程式命名為 Set-User (其作用),則假設需要設定使用者屬性的 Cmdlet 的其他團隊要做什麼?(指令程式名稱必須是唯一的。)解決方案是使用前置碼。因此,我們現在有具有 Set-MsolUser、Set-CsUser 和 Set-SPOSiteUser 這類名稱的指令程式。

無論如何,執行 Get-MsolUser 會傳回與下面類似的資訊:

UserPrincipalName                     DisplayName           isLicensed
-----------------                     -----------           ----------
ZrinkaM@litwareinc.onmicrosoft.com    Zrinka Makovac        True
BonnieK@litwareinc.onmicrosoft.com    Bonnie Kearney        True
FabriceC@litwareinc.onmicrosoft.com   Fabrice Canel         True
BrianJ@litwareinc.onmicrosoft.com     Brian Johnson         False 
AnneWlitwareinc.onmicrosoft.com       Anne Wallace          True

這些是您的所有 Office 365 使用者。

但是,假設您只想要查看未授權使用者清單;亦即,已新增至 Office 365 但尚未授權使用任何軟體應用程式的使用者。這也十分簡單:

Get-MsolUser -UnlicensedUsersOnly

同樣地,我們已呼叫 Get-MsolUser 指令程式,只有這時已附加 UnlicensedUsersOnly 參數。如名稱所示,該參數會將傳回的資料限制為尚未發出任何授權的使用者:

UserPrincipalName                     DisplayName           isLicensed
-----------------                     -----------           ----------
BrianJ@litwareinc.onmicrosoft.com     Brian Johnson         False
ScottW@litwareinc.onmicrosoft.com     Scott Wallace         False

非常好。

我們可能也會指出 Windows PowerShell 有資格作為 Martians 所建立的電腦語言。許多人考量 Windows PowerShell 時,會將命令考量為:

gc test.txt | sort {[int]$_} |% {$i = 1}{while ($i -lt $_){$i;$i++};$i++}

假定該命令有些遲鈍….反之,我們僅會顯示只傳回尚未針對 Office 365 授權的使用者的命令。為了這麼做,我們使用名稱為 Get-MsolUser 的指令程式以及名稱為 UnlicensedUsersOnly 的參數:

Get-MsolUser -UnlicensedUsersOnly

而且,執行該命令時,只會收到未授權使用者。

這只是表示您通常可以決定將 Windows PowerShell 設為難懂的,或清楚且直接的。

Windows PowerShell 可讓您使用想要的方式執行作業。例如,我們已看到執行 Get-MsolUser Cmdlet 會帶回三個屬性值:

  • UserPrincipalName

  • DisplayName

  • isLicensed

這十分不錯,但我們真正想要看到的是使用者顯示名稱、他或她工作的部門,及使用者「使用」Office 365 服務的國家/地區嗎?接下來呢?

註記附註:
是的,「使用」並不是個很好的字。但是,不要擔心術語:UsageLocation 屬性指出使用者一般使用 Office 365 的地理位置。而這十分重要:Office 365 授權、原則和可用功能某種程度上依賴此位置。

如我們所見,Get-MsolUser 只會顯示我們偏好的其中一個屬性:DisplayName。我們似乎不怎麼幸運,對吧?

是的。請改為執行此命令:

Get-MsolUser | Select-Object DisplayName, Department, UsageLocation

以下是該命令傳回的內容:

DisplayName             Department                       UsageLocation
-----------             ----------                       -------------
Zrinka Makovac          Sales & Marketing                US
Bonnie Kearney          Sales & Marketing                US
Fabrice Canel           Legal                            US
Brian Johnson
Anne Wallace            Executive Management             US
Alex Darrow             Sales & Marketing                US
David Longmuir          Operations                       US

我們目前不會去解釋這些如何運作;這只是篇概觀文章。而是,我們只會注意到 Select-Object Cmdlet (隨附為 Windows PowerShell 3.0 的一部分) 可讓您挑選和選擇想要 Cmdlet 傳回的屬性。您說只想要看到 UsageLocation 屬性的值嗎?那麼,就告訴 Select-Object 只傳回那個屬性:

Get-MsolUser | Select-Object DisplayName

Select-Object 甚至可讓您傳回項目的所有屬性值;請嘗試執行此命令,並看看發生什麼事:

Get-MsolUser | Select-Object *

這十分有用,因為就如我們所見,Cmdlet 不一定會傳回項目的所有可用資訊。如果您想要看到 Get-MsolUser 必須提供有關使用者的所有項目,則請使用與下面類似的命令:

Get-MsolUser -UserPrincipalName "BelindaN@litwareinc.onmicosoft.com" | Select-Object *

且,以下是方便使用的有用命令,可傳回沒有使用位置的使用者的相關資訊。(這十分重要,因為除非已設定該位置,否則您無法執行那些使用者的特定作業。)命令如下:

Get-MsolUser | Where-Object {$_.UsageLocation -eq $Null} | Select-Object DisplayName, Department, UsageLocation

而以下是傳回的資料:

DisplayName              Department                      UsageLocation
-----------              ----------                      -------------
Brian Johnson 
Scott Wallace            Operations

這只是我們目前沒有 UsageLocation 的那兩位使用者。

到目前為止,我們已經知道您可以使用 Windows PowerShell 來傳回資訊。或許更棒的事實是,您也可以使用 Azure Active Directory 指令程式來設定資訊。您說 Belinda Newman 已經搬到法國,並且必須將她的使用位置改設為 FR,法國的 ISO (國際標準組織) 代碼是多少?確定:

Set-MsolUser -UserPrincipalName "BelindaN@litwareinc.onmicosoft.com" -UsageLocation "FR"

您看就是這麼簡單。我們已經知道 Get-MsolUser 指令程式會傳回名為 UsageLocation 的屬性。所以我們該設定這個屬性值嗎?我們只需使用對應的 Set-MsolUser 指令程式,而且沒錯,我們應該設定 UsageLocation 參數:

Set-MsolUser -UserPrincipalName "BelindaN@litwareinc.onmicosoft.com" -UsageLocation "FR"

這一點都不難。

另外下面值得一提。您說所有使用者都搬到法國了?沒問題:

Get-MsolUser | Set-MsolUser -UsageLocation "FR"

在此情況下,我們已經使用 Get-MsolUser 指令程式傳回我們的所有使用者帳戶。我們接著將該資訊「輸送」到 Set-MsolUser 指令程式。看到命令中的小管線分隔字元了嗎,此字元看起來像這樣:

|

當您在 Windows PowerShell 命令中看到管線字元時,代表您正在收集透過第一個指令程式 (Get-MsolUser) 所擷取的任何資訊,然後將所有資訊交給第二個指令程式 (Set-MsolUser)。在此情況下,這代表我們打算讓 Set-MsolUser 使用我們的使用者帳戶,並將 UsageLocation 屬性設為 FR。

還不錯 - 我們是老王賣瓜,自賣自誇。

註記附註:
好啦,或許我們說的很容易。但沒必要苦惱:以下是搭配 Windows PowerShell 使用輸送和管線的清楚介紹

如前所述,Azure 指令程式的功能五花八門;例如,以下命令會傳回您所擁有的 Office 365 授權數目資訊,以及您尚未散佈的授權數目:

Get-MsolAccountSku

它將傳回如下所示的資訊:

AccountSkuId                 ActiveUnits   WarningUnits  ConsumedUnits
------------                 -----------   ------------   ------------
litwareinc:ENTERPRISEPACK    25            0              25

在我們的範例資料中,litwareinc 網域已發出 25 個授權 (ActiveUnits),而且目前所有的 25 個授權都已指派給使用者 (ConsumedUnits)。

這是件好事。當然,如果能夠查看已指派給個別使用者的授權,那就再好不過了。在未說明所有詳細資料的情況下,以下是我們如何找到目前指派給 Ken Myer 的授權:

Get-MsolUser -UserPrincipalName "kenmyer@litwareinc.onmicrosoft.com" | Select-Object -ExpandProperty Licenses | Select-Object -ExpandProperty ServiceStatus

好吧,我們會提供粗略的說明,因為這絕對是個更複雜的命令。在這個命令中,我們會先使用 Get-MsolUser 來傳回使用者 kenmyer@litwareinc.onmicrosoft.com 的資訊。我們接著會將這些資訊透過管道傳送給 Select-Object Cmdlet,然後使用 ExpandProperty 參數來「展開」授權屬性。我們必須這樣做的原因是因為授權是多值屬性;這表示它包含多值 (在此情況下,多個授權),而且我們想要確定我們正在使用所有授權。我們接著會將授權資料輸送到 Select-Object,並展開服務狀態屬性,才能取得有關每筆個別授權的詳細資訊。

註記附註:
如果粗略說明證實沒有多大用處,請參閱多屬性值上的文章

當全部完成後,我們應該會得到如下所示的內容:

ServicePlan                      ProvisioningStatus
-----------                      ------------------
YAMMER_ENTERPRISE                None
RMS_S_ENTERPRISE                 Success
OFFICESUBSCRIPTION               Success
MCOSTANDARD                      Success
SHAREPOINTWAC                    Success
SHAREPOINTENTERPRISE             Success
EXCHANGE_S_ENTERPRISE            Success

無可否認地,乍看之下可能不容易看懂內容。幸運的是,它不像看起來那樣難以理解。ServicePlan 屬性包含授權的集合 (組織中的可用授權取決於您所購買的 Office 365 計劃)。我們 ServicePlan 屬性的值會等同以下內容:

 

索引編號 服務計劃 產品

0

YAMMER_ENTERPRISE

Yammer

1

RMS_S_ENTERPRISE

Windows Azure Active Directory

2

OFFICESUBSCRIPTION

Office Professional Plus

3

MCOSTANDARD

Lync

4

SHAREPOINTWAC

Office Web Apps

5

SHAREPOINTNETERPRISE

SharePoint

6

EXCHANGE_S_ENTERPRISE

Exchange

接著,我們可以從 ProvisioningStatus 屬性知道是否已指派授權:

  • 表示沒有曾經指派過的授權。

  • 成功表示已指派授權。

  • 停用表示已指派授權,但之後已停用。

如您所見,Ken Myer 已被指派了所有可用授權,除了 Yammer 以外。

註記附註:
上表中的索引編號是多少?索引編號是服務計劃的另一個識別碼。根據正確的舊式電腦程式設計,集合 (如下所示) 中的第一個項目會被指派索引編號 0。集合中的第二個項目會被指派索引編號 1,第三個項目會被指派索引編號 2,以此類推。我們馬上就會看到,這些編號可以用來執行如顯示具有 Yammer 授權的所有使用者,或沒有 Yammer 授權的所有使用者等作業。

那麼我們可以變更這些授權指派嗎?例如,我們可以停用 Ken 使用 Exchange 和 Lync Online 的能力嗎?當然可以。同樣地,我們不會逐行解說全部的運作方式;這將留待日後再做說明。不過,在 Office 365 中,您可以透過指出應該要停用的授權來管理授權 (至少部分授權)。您可以透過建立新的授權選項物件來達到此目的,如下所示:

$disabledLicenses = New-MsolLicenseOptions -AccountSkuId "litwareinc:ENTERPRISEPACK" -DisabledPlans "MCOSTANDARD","EXCHANGE_S_ENTERPRISE"

我們在這裡所做的只是想要停用兩個計劃,以 litwareinc 網域 (已購買企業授權套件) 為例:Lync (MCOSTANDARD) 和 Exchange (EXCHANGE_S_ENTERPRISE)。請注意,此命令本身不會為任何使用者停用這些授權。相反地,它會建立已停用 Lync 和 Exchange 的一般使用者授權。然後,我們會將該一般使用者授權指派給實際人員:

Set-MsolUserLicense -UserPrincipalName "kenmyer@litwareinc.onmicrosoft.com" -LicenseOptions $disabledLicenses

如果我們執行該命令,然後再看一下 Ken 的使用者授權,我們應該會看到如下所示的內容:

ServicePlan                      ProvisioningStatus
-----------                      ------------------
YAMMER_ENTERPRISE                None
RMS_S_ENTERPRISE                 Success
OFFICESUBSCRIPTION               Success
MCOSTANDARD                      Disabled
SHAREPOINTWAC                    Success
SHAREPOINTENTERPRISE             Success
EXCHANGE_S_ENTERPRISE            Disabled

瞧!Exchange 和 Lync Online 兩者皆已停用。

不可否認地,Office 365 使用者授權可能有些複雜。但是,使用 Office 365 無法作到;原因是 Office 365 使用者授權可能有些複雜。歸根究柢,透過 Office 365 可提供不同的授權套件,而且可以將使用者指派給適合的最多 (或最少) 個別產品授權。記錄所有項目並不容易,特別是 Office 365 系統管理中心一次只可讓您檢視一位使用者的授權詳細資料。想要有所有已獲指派 Lync Online 授權之使用者的清單嗎?您當然會想要。但是,系統管理中心無法輕易地提供。

但是 Windows PowerShell 就可以提供。記得在使用 Office 365 使用者授權中討論的索引號碼嗎?如果記得,則可能會記得,在我們的授權套件中,Lync Online 的索引號碼是 3。這表示我們可以使用這行難懂的程式碼,傳回所有已發給 Lync Online 授權之使用者的清單:

Get-MsolUser | Where-Object {$_.isLicensed -eq $true -and $_.Licenses[0].ServiceStatus[3].ProvisioningStatus -ne "Disabled"}

而且是的,它的確有點複雜。但是它確實會傳回您要求它傳回的資訊:

UserPrincipalName                     DisplayName           isLicensed
-----------------                     -----------           ----------
ZrinkaM@litwareinc.onmicrosoft.com    Zrinka Makovac        True
FabriceC@litwareinc.onmicrosoft.com   Fabrice Canel         True
AnneW@litwareinc.onmicrosoft.com      Anne Wallace          True
AlexD@litwareinc.onmicrosoft.com      Alex Darrow           True

如果想要,也可以取得所有尚未發給 Lync Online 授權之使用者的清單:

Get-MsolUser | Where-Object {$_.isLicensed -eq $true -and $_.Licenses[0].ServiceStatus[3].ProvisioningStatus -ne "Enabled"}

這會傳回完全不同的使用者清單:

UserPrincipalName                     DisplayName           isLicensed
-----------------                     -----------           ----------
BonnieK@litwareinc.onmicrosoft.com    Bonnie Kearney        True
BrianJ@litwareinc.onmicrosoft.com     Brian Johnson         False

但是,如果我們不想要了解 Lync Online 授權,要怎麼做?如果您想要了解 SharePoint Online 授權,要怎麼做?如果您回頭看授權表格,會看到 SharePoint Online 授權的索引號碼是 5。在前一個程式碼範例中,指定 ServiceStatus 屬性時使用的是索引號碼 3 (Lync Online 的索引號碼):

Get-MsolUser | Where-Object {$_.isLicensed -eq $true -and $_.Licenses[0].ServiceStatus[3].ProvisioningStatus -ne "Disabled"}

若要取回 SharePoint Online 授權,只需要將 3 取代為 5:

Get-MsolUser | Where-Object {$_.isLicensed -eq $true -and $_.Licenses[0].ServiceStatus[5].ProvisioningStatus -ne "Disabled"}

就是這麼容易。

如需詳細資訊,請查看 Office 365 工作負載的授權使用者文章。是否需要投入一些心力來主控使用 Windows PowerShell 所獲得的授權選項?沒錯。投入的少許心力是否可以善加利用使用 Windows PowerShell 所取得的授權選項?這真的是由您自己決定。

但是:是的。

Azure Active Directory 指令程式與 Exchange 和 Lync Online 指令程式不同,至少使用個別使用者帳戶的時機不同。例如,使用 Lync Online 和 Get-CsOnlineUser 指令程式,您可以在命令中包括 Identity 參數,也可以不使用 Identity 參數。換句話說,這兩個命令都會運作,而且都會傳回完全相同的資訊:

Get-CsOnlineUser -Identity "kenmyer@litwareinc.onmicrosoft.com"
Get-CsOnlineUser "kenmyer@litwareinc.onmicrosoft.com"

但是,這不適用於 Azure Active Directory 指令程式。此命令運作如下:

Get-MsolUser -UserPrincipalName "kenmyer@litwareinc.onmicrosoft.com"
註記附註:
我們已在這裡使用 UserPrincipalName 參數,因為 Get-MsolUser 沒有 Identity 參數。

但是,此命令會運作:

Get-MsolUser "kenmyer@litwareinc.onmicrosoft.com"

為什麼?許多 Lync Online 和 Exchange 指令程式會將 Identity 參數設定為「位置參數」,而不討論許多技術詳細資料。無論如何,在這些情況下,這表示如果您未指定參數名稱 (例如 –Identity),則指令程式會假設命令的第一個參數是 Identity 參數。只要透過指定使用者身分識別來開始,就可以使用或不使用 –Identity 參數。任一方法都適用:

Get-CsOnlineUser -Identity "kenmyer@litwareinc.onmicrosoft.com"
Get-CsOnlineUser "kenmyer@litwareinc.onmicrosoft.com"

不過,Azure Active Directory 指令程式不支援位置參數。假設您包括沒有隨附參數的值:

Get-MsolUser "kenmyer@litwareinc.onmicrosoft.com"

在這種情況下,您會收到與下面類似的錯誤訊息:

Get-MsolUser : A positional parameter cannot be found that accepts argument 'kenmyer@litwareinc.onmicrosoft.com'.

也請注意,Exchange 和 Lync Online 可讓您使用數種不同的方式來參照使用者。例如,所有這些 Exchange 命令都會傳回相同的信箱資訊:

Get-Mailbox -Identity "Ken Myer"
Get-Mailbox -Identity "kenmyer@litwareinc.onmicrosoft.com"
Get-Mailbox -Identity "kenmyer"

這些命令分別會使用使用者的 Active Directory 顯示名稱、其使用者主體名稱和其電子郵件別名。而且其中一個身分識別將會運作。但是,這是使用 Exchange 和 Lync Online。在大多數的情況下,Azure Active Directory 需要您使用使用者主體名稱,而且只能使用使用者主體名稱:

Get-MsolUser -UserPrincipalName "kenmyer@litwareinc.onmicrosoft.com"
註記附註:
技術上而言,您可以使用 ObjectId 參數。但是這需要您輸入指派給使用者帳戶的 GUID (全域唯一識別碼)。例如:
Get-MsolUser –ObjectId "62e90394-69f5-4237-9190-012177145e10"
我們會讓您自行決定使用 UserPrincipalName 還是 ObjectId。

不可否認地,這可能會合併許多項目,至少對新的 Windows PowerShell 使用者而言是這樣。如果您 新的 Windows PowerShell 使用者,則可能會想要查看使用參數上的簡介文章。

 
顯示: