使用 PowerShell 连接 Office 365

在最近电视上播放的一个商业节目中,一位主持人(成年人)问一群小学生:“谁认为多比少好?”所有孩子一致认为多比少好,而且主持人也同意他们的观点。“这并不复杂,”主持人说,“多比少好。”

说实话,我们不愿意让一群小学生扫兴,但是我们必须要说:孩子们,你们错了。这并不复杂:事实是,多并不一定比少好。

有恰当的示例吗?使用 Windows PowerShell 管理 Office 365 就是一个示例。4 个 Office 365 组件(Office 365 用户和许可、SharePoint Online、Exchange Online 和 Lync Online)要求您使用不同的连接方法。对于 Office 365 和 SharePoint Online,您通常启动它们各自的命令行管理程序。使用 Lync Online,您可启动 Windows PowerShell 的本地会话,然后使用 New-CsOnlineSession cmdlet 连接到 Office 365。使用 Exchange Online,您可启动 Windows PowerShell 的本地会话,然后使用 New-PSSession cmdlet 连接到 Office 365。

这就复杂了。但是,这对 Office 365 管理员而言真的很重要吗?

事实上真的很重要:使用 4 种不同的连接方法,您需要使用 4 个不同的 Windows PowerShell 实例来管理 Office 365 的所有组件。也就是说,如果您想同时管理 Office 365、SharePoint、Exchange 和 Lync 管理任务,则您的台式计算机需要像下面这样显示:

4 个 Windows PowerShell 控制台同时运行

正如我们所说的,多并不一定比少好。

这显然不是理想情况(尤其是,您无法轻松地在这 4 个 PowerShell 窗口之间交换数据)。这便引出一个重要的问题:能否只使用一个 Windows PowerShell 实例来管理 Office 365、Lync、Exchange 和 SharePoint。

我们希望有人提出这个问题。

在我们说明如何使用一个 Windows PowerShell 实例来管理 Office 365 的所有组件之前,我们应注意,本文假定您已创建 Office 365 帐户,并且已下载并安装使用 Windows PowerShell 管理 Office 365 所需的软件。假定您已完成这些准备工作,那么只需遵循以下 7 个步骤,即可创建便于您同时管理 Office 365、Lync、Exchange 和 SharePoint 的单个 PowerShell 窗口

从技术上说,无需从此处开始:可以先启动 Windows Azure Active Directory 命令行管理程序或 SharePoint Online 命令行管理程序。我们将从一开始就完全启动,即以管理员身份运行普通的旧 Windows PowerShell。

若要以管理员身份运行 Windows PowerShell,需完成以下两个过程之一。如果您运行的是 Windows 8,请执行以下操作:

  1. 访问超级按钮栏,单击“搜索”,然后右键单击“Windows PowerShell”。您可以在 Windows 8 计算机上(触摸屏或非触摸屏)按住 Windows 键并按 C,快速访问超级按钮栏。
  2. 在屏幕底部的工具栏中,单击“以管理员身份运行”。
  3. 如果显示“用户帐户控制”对话框,则单击“是”确定要通过管理员凭据运行 Windows PowerShell。

如果您运行的是 Windows 7(或 Windows Servers 2008 或 Windows Server 2012),请执行以下操作:

  1. 单击“启动”,依次单击“所有程序”、“附件”、“Windows PowerShell”,然后右键单击“Windows PowerShell”,单击“以管理员身份运行”。
  2. 如果显示“用户帐户控制”对话框,单击“是”确定要通过管理员凭据运行 Windows PowerShell。

必须完全以管理员身份运行 Windows PowerShell。如果不这样做的话,将在尝试导入 Office 365 的一个模块时收到与此类似的错误消息。

The specified module 'Microsoft.Online.SharePoint.Online.PowerShell' was not loaded because no valid module file was found in any directory.

不可否认,这不是最明显的错误消息:问题不是无法找到模块文件,而是不以管理员身份运行就无法导入模块。解决此问题的唯一方法是关闭 Windows PowerShell,然后以管理员身份重启。

启动 Windows PowerShell 并运行后,应确定已将 PowerShell 配置为运行脚本。为此,在 PowerShell 提示下键入此命令,然后按 ENTER 键:

Get-ExecutionPolicy

这样做有什么必要?如果将执行策略设置为 Unrestricted 或 RemoteSigned 以外的任何参数,将会在尝试导入模块时遇到类似的错误:

Import-Module : File C:\Program Files\Common Files\Microsoft Lync Server2013\Modules\lynconlineconnector\LyncOnlineConnectorStartup.psm1 cannot be loaded because running scripts is disabled on this system.

如果您需要更改执行策略,请使用 Set-ExecutionPolicy cmdlet:

Set-ExecutionPolicy RemoteSigned

请注意,无需退出和重启 PowerShell;更改将立即生效。

 

 

凭据对象可以将您的用户名和密码安全传递到 Office 365。若要创建凭据对象,请在 Windows PowerShell 提示符处键入以下命令,再按 ENTER:

$credential = Get-Credential
注释注意:
$credential 是用于存储凭据对象的变量。您不一定要为变量 $credential 命名,但命名后可以更容易记住哪个变量包含凭据对象。(这很重要,因为我们将多次重复使用该变量)。您也可以更容易理解我们的示例,因为本文始终使用 $credential 表示凭据对象。

然后,Windows PowerShell 会显示一个对话框,如下所示:

空白“凭据”请求对话框。在“用户名”框中键入您的 Office 365 用户名,格式为“username@domainname”(例如,kenmyer@litwareinc.onmicrosoft.com),在“密码”框中键入您的 Office 365 密码,再单击“确定”:

已完成“凭据”请求对话框。请确保您指定的用户帐户拥有对 Office 365 的全局管理员权限。否则,您的登录尝试将会失败。

请注意,通常情况下,您不会看到有关凭据对象已创建的任何确认信息。(Windows PowerShell 通常在出现错误时通知您,但不一定会在一切顺利的情况下通知您)。如果您想验证是否已创建凭据对象,请在 Windows PowerShell 提示符处键入以下内容,再按 ENTER:

$credential

然后,您应该会在屏幕上看到以下内容:

UserName                               Password
--------                               --------
kenmyer@litwareinc.onmicrosoft.com     System.Security.SecureString

此时,请注意,Get-Credential cmdlet 只创建凭据对象,并不对您进行身份验证,也不验证您提供的用户名和密码是否正确。例如,假设您将用户名错误键入为“eknmyer@litwareinc.onmicrosoft.com”。如果确实如此,则 Get-Credential 将使用该用户名创建凭据对象,并不会检查该用户名是否有效。在您真正使用凭据对象尝试连接到 Office 365 之前,您不会知道自己创建的凭据对象是否真的有效。

说到这,我们已进行到过程中的这一步:准备连接到 Office 365。

 

 

我们将从连接到 Office 365 本身开始。重复一遍,我们无需从此步骤开始;我们可以按任意顺序连接到各个组件。不过,我们必须从某个步骤开始,因此…

我们首先需要导入 Office 365 模块。为此,请在 Windows PowerShell 提示符处运行以下命令:

Import-Module MsOnline

无可否认,似乎看不出来发生了什么。如果您不放心并且想验证是否已导入该模块,请运行以下命令:

Get-Module

在此命令返回的模块列表中,您应该会看到以下内容:

Manifest  1.0   MSOnline    {Add-MsolForeignGroupToRole, Add-MsolG...}

如果您看到列表中有 MSOnline,则表明一切都按计划进行。

使用所创建的凭据对象(请参阅步骤 2:创建 Windows PowerShell 凭据对象)和所加载的 MsOnline 模块,我们现在可以使用 Connect-MsolService cmdlet 和以下命令连接到 Office 365:

Connect-MsolService -Credential $credential

请注意,您只需提供凭据对象 ($credential)。根据这些凭据,Office 365 会自动将您连接到正确的域。您无需在运行 Connect-MsolService 时指定您的域名。

运行完 Connect-MsolService cmdlet 后,照常似乎看不出来发生了什么。若要验证您是否真正连接到 Office 365,请运行以下命令:

Get-MsolDomain

系统应该会返回以下内容:

Name                         Status          Authentication
----                         ------          --------------
litwareinc.onmicrosoft.com   Verified        Managed

您已连接到一个 Office 365 组件,还需要连接到其他三个组件。

 

接下来:SharePoint Online。我们需要再次导入正确的 Windows PowerShell 模块,才能进行任何操作。幸运的是,导入非常简单;只需在 Windows PowerShell 提示下键入此命令,然后按 ENTER 键:

Import-Module Microsoft.Online.SharePoint.PowerShell
注释注意:
进行此操作时,您可能会看到屏幕上显示以下错误消息:
警告:从“Microsoft.Online.SharePoint.PowerShell”模块导入的某些命令名称包括未批准的动词,该动词可能导致这些命令名称不易被发现。若要查找包含未批准的动词的命令,可再次运行包含 Verbose 参数的 Import-Module 命令。若要获取已批准动词的列表,请键入 Get-Verb。
您可以安全地忽略此警告。显示此消息的原因是因为 SharePoint Online 的一个 cmdlet (Upgrade-SPOSite) 在其名称中使用了 Upgrade,此动词通常不用于 Windows PowerShell cmdlet 名称中。但是,这种与命名标准的偏差不会产生任何影响,并且 cmdlet 将运行良好。

为了连接到 SharePoint Online,您需要提供两项信息:您的凭据及 SharePoint 管理网站的 URL。凭据部分很简单:我们已经在 $credential 变量中存储了凭据(请参阅步骤 2:创建 Windows PowerShell 凭据对象)。管理网站的 URL 也很容易确定。假定您的 Office 365 域名如下:

litwareinc.onmicrosoft.com

若要确定管理网站 URL,请执行以下操作:

  1. 使用 https:// 前缀开启。
  2. 添加域名的域主机部分。例如,如果域为 litwareinc.onmicrosoft.com,则域主机名称为 litwareinc。如果域名为 contoso.onmicrosoft.com,则域主机名称为 contoso。等等。
  3. 添加连字符 (),后跟 admin.sharepoint.com-admin.sharepoint.com

即:

https:// + litwareinc + -admin.sharepoint.com = https://litwareinc-admin.sharepoint.com

构建了 URL 后,就可以使用该 URL 及凭据对象连接到 SharePoint Online。只需使用类似于以下的命令调用 Connect-SPOService cmdlet:

Connect-SPOService -Url https://litwareinc-admin.sharepoint.com -credential $credential

若要确认已连接,可在 Windows PowerShell 提示下键入以下命令,并按 ENTER 键。

Get-SPOSite

您应该会收到所有 SharePoint Online 网站的列表:

Url                                       Owner          Storage Quota
---                                       -----          -------------
http://litwareinc-public.sharepoint.com/                 1000
https://litwareinc.sharepoint.com/                       1000
https://litwareinc.sharepoint.com/search                 1000

但以下部分最重要:您的 Office 365 命令(步骤 3:连接到 Office 365 中所述的命令)仍将正常运行。(尝试运行 Get-MsolUser 以亲自体会。)这意味着您可以管理 Windows PowerShell 同一实例中的 Office 365 和 SharePoint Online。这很好。但还不够好。

 

连接到 Lync Online(和 Exchange Online)并不非常难,但是与连接到 Office 365 或 SharePoint Online 相比,操作起来需要点技巧。这是因为您的计算机上并未安装 Lync 和 Exchange cmdlet,这一点不同于 Office 365 和 SharePoint cmdlet。相反,每当您登录,相应的 cmdlet 都会临时复制到您的计算机中。当您注销时,这些 cmdlet 会从您的计算机中删除。

您必须导入 Lync 模块才能连接到 Lync Online。为此,请运行以下命令:

Import-Module LyncOnlineConnector

然后,在导入该模块后,运行以下命令:

$lyncSession = New-CsOnlineSession -Credential $credential

在该命令完成后,您会在屏幕上看到以下内容:

Id Name       ComputerName    State  ConfigurationName    Availability
-- ----       ------------    -----  -----------------    ------------
1  Session1   webdir0a.onl... Opened Microsoft.PowerShell Available

此时发生了什么情况?发生的情况就是我们已创建远程 PowerShell 会话。在此示例中,这就意味着我们已连接到其中一个 Office 365 服务器上运行的 Windows PowerShell 实例。不过,只创建这样的会话对我们并没有多大意义。例如,尝试运行以下 Lync Online 命令:

Get-CsMeetingConfiguration

该命令将会失败,您会看到以下错误消息:

Get-CsMeetingConfiguration : The term 'Get-CsMeetingConfiguration' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.

为什么调用 Get-CsMeetingConfiguration 失败了?这个问题很简单:因为 Get-CsMeetingConfiguration cmdlet 根本不存在于您的计算机中。尽管我们已连接到 Office 365,但是我们尚未下载管理 Lync Online 所需的脚本、cmdlet 和其他项目。为此,我们必须运行以下命令:

Import-PSSession $lyncSession

当您导入 Windows PowerShell 会话时,您应该会看到下面的进度栏(该进度栏报告要导入到您的计算机中的所有 Lync Online 管理项目):

Lync Online 进度栏。在进度栏消失后,您应该会看到下面的输出结果:

ModuleType Version    Name               ExportedCommands
---------- -------    ----               ----------------
Script     1.0        tmp_swc5mp4v.1ck  {Copy-CsVoicePolicy, Disabl...

现在尝试运行 Get-CsMeetingConfiguration,并观察会发生什么情况。您应该会收到类似于以下的内容:

Identity                        : Global
PstnCallersBypassLobby          : True
EnableAssignedConferenceType    : False
DesignateAsPresenter            : Company
AssignedConferenceTypeByDefault : True
AdmitAnonymousUsersByDefault    : True
RequireRoomSystemsAuthorization : False
LogoURL                         :
LegalURL                        :
HelpURL                         :
CustomFooterText                :
AllowConferenceRecording        : True

这样就对了。现在,剩下要做的就是将 Exchange 添加到 Windows PowerShell 会话中。

 

现在要做的是连接到 Exchange Online,我们将进行此操作:我们可以使用单个 Windows PowerShell 会话管理 Office 365、SharePoint Online、Lync Online 和 Exchange Online。明确这一点后,运行此命令,将创建远程 Windows PowerShell 与 Exchange Online 的会话:

$exchangeSession = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri "https://outlook.office365.com/powershell-liveid/" -Credential $credential -Authentication "Basic" -AllowRedirection

不可否认,与运行的一些其他的命令相比,此命令稍微复杂一些。但没关系,因为您可以复制此命令并完全按照原样运行它,即使命令中包括如下 URI 也是如此:https://outlook.office365.com/powershell-liveid/。但是,无论域名是什么,此 URI 始终相同。因此,复制、粘贴并运行:就这么简单。

注释注意:
为什么连接到 Exchange 的命令比连接到 Lync Online 的命令更复杂?从技术上而言并非如此:两个命令的作用完全相同。然而,Lync Online 团队创建自己的 cmdlet – New-CsOnlineSession,在连接到 Exchange 时隐藏了一些参数(如 Authentication 和 AllowRedirection)。Authentication 和 AllowRedirection 参数有效地构建于 New-CsOnlineSession cmdlet 中,而无需要求您自己键入信息。您需要在连接到 Exchange 时键入这些参数,因为 Exchange 使用标准 New-PsSession cmdlet 连接到 Office 365。这样做有何缺点?您需要键入稍多一点信息。这样做有何优点?无需下载并安装 Exchange Online 模块。

连接到 Exchange Online 后,将看到以下类似的警告消息:

WARNING: Your connection has been redirected to the following URI: "https://pod51035psh.outlook.com/powershell-liveid?PSVersion=4.0"

也无需顾虑此消息:此消息只是提示 Office 365 已对您进行身份验证,并将会话指向 Office 365 域。您只需导入此远程会话,同针对 Lync 执行的操作一样:

Import-PSSession $exchangeSession

然后,如果运行正常,将看到屏幕上类似下面的内容:

WARNING: The names of some imported commands from the module 'tmp_nweiqjvl.geu' include unapproved verbs that might make them less discoverable. To find the commands with unapproved verbs, run the Import-Module command again with the Verbose parameter. For a list of approved verbs, type Get-Verb.

ModuleType Version  Name             ExportedCommands
---------- -------  ----             ----------------
Script     1.0      tmp_nweiqjvl.geu {Add-AvailabilityAddressSpace...

现在,尝试运行以下命令:

Get-AcceptedDomain

应该可以看到有关 Exchange Online 域的信息:

Name            DomainName          DomainType      Default
----            ----------          ----------      -------
litwareinc.com  litwareinc.com      Authoritative   True

如果该命令执行成功,则意味着您现在可以从单个 PowerShell 会话管理所有 Office 365。

 

您可能会想,为什么我们会费心添加这一步骤。结束 Windows PowerShell 会话究竟有多困难:您只关闭 PowerShell 窗口,然后一切就消失了。案例到此结束。

确实如此:一切都消失。然而,这并不一定代表您已正确处理远程会话。例如,即使您关闭 PowerShell 窗口,您的 Lync Online 远程连接仍将在接下来的 15 分钟左右时间内继续保持有效。这会是一个问题。为什么?因为 Lync Online 限制任何人或任何域可以打开的同步连接的数量。使用 Lync Online,每个管理员一次最多可打开 3 个连接,而一个域最多可打开 9 个连接。如果您登录 Lync Online,然后在没有正确关闭会话的情况下退出,则该会话在接下来的 15 分钟左右时间内继续保持打开。因此,您或您域中的其他管理员可以使用的连接就少掉一个。

也就是说,这次孩子们的看法是对的:拥有较多的可用连接好过拥有较少的可用连接。反过来,也就是说,最好在使用完会话后立即关闭会话。

首先,让我们关闭您为 Lync Online 和 Exchange Online 打开的远程会话。在我们这样做之前,请先运行以下命令:

Get-PSSession

Get-PSSession cmdlet 应该会向您显示您至少打开 2 个远程会话,一个是 Lync 会话,另一个是 Exchange 会话(正在运行的远程会话可能超过两个,具体取决于您是否已使用此 PowerShell 实例连接到除 Office 365 之外的其他位置)。无论如何,您应该会看到类似下面的内容:

Id Name     ComputerName    State   ConfigurationName    Availability
-- ----     ------------    -----   -----------------    ------------
 2 Session2 webdir0a.onl... Opened  Microsoft.PowerShell Available
 3 Session3 pod51035psh.... Opened  Microsoft.Exchange   Available

若要关闭这两个会话,请使用下面这些命令(第一个用于关闭 Lync 会话,第二个用于关闭 Exchange 会话):

Remove-PSSession $lyncSession
Remove-PSSession $exchangeSession

如果您现在运行 Get-PSSession cmdlet,则应该会什么也看不到(当然,除非您有其他远程会话在运行):

没有任何远程会话的 Windows PowerShell 控制台

注释注意:
如果您想同时关闭所有远程会话,则可以使用以下命令:
Get-PSSession | Remove-PSSession

如果您现在尝试运行 Lync Online 或 Exchange Online cmdlet(例如,Get-CsMeetingConfiguration),则应该会看到以下错误消息:

Get-CsMeetingConfiguration : The term 'Get-CsMeetingConfiguration' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.

出现此错误消息是因为我们在关闭远程会话时删除了 Lync Online 和 Exchange Online cmdlet。

若要关闭 SharePoint Online 会话,请键入以下命令:

Disconnect-SPOService

同样地,看起来好像什么也没发生。不过,如果您尝试运行 Get-SPOSite cmdlet,则会看到以下错误消息:

get-sposite : No connection available. Use Connect-SPOService before running this CmdLet.

您无法检索站点信息是因为您不再连接到 SharePoint Online。

至于您与 Office 365 的连接本身,尽管存在 Connect-MsolService cmdlet,但缺少对应的 Disconnect-MsolService

Latest posts by Exchange中文站 (see all)
发布于: 浏览:12043 次

还没有评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据