在最近电视上播放的一个商业节目中,一位主持人(成年人)问一群小学生:“谁认为多比少好?”所有孩子一致认为多比少好,而且主持人也同意他们的观点。“这并不复杂,”主持人说,“多比少好。”
说实话,我们不愿意让一群小学生扫兴,但是我们必须要说:孩子们,你们错了。这并不复杂:事实是,多并不一定比少好。
有恰当的示例吗?使用 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 个 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,请执行以下操作:
- 访问超级按钮栏,单击“搜索”,然后右键单击“Windows PowerShell”。您可以在 Windows 8 计算机上(触摸屏或非触摸屏)按住 Windows 键并按 C,快速访问超级按钮栏。
- 在屏幕底部的工具栏中,单击“以管理员身份运行”。
- 如果显示“用户帐户控制”对话框,则单击“是”确定要通过管理员凭据运行 Windows PowerShell。
如果您运行的是 Windows 7(或 Windows Servers 2008 或 Windows Server 2012),请执行以下操作:
- 单击“启动”,依次单击“所有程序”、“附件”、“Windows PowerShell”,然后右键单击“Windows PowerShell”,单击“以管理员身份运行”。
- 如果显示“用户帐户控制”对话框,单击“是”确定要通过管理员凭据运行 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,请执行以下操作:
- 使用 https:// 前缀开启。
- 添加域名的域主机部分。例如,如果域为 litwareinc.onmicrosoft.com,则域主机名称为 litwareinc。如果域名为 contoso.onmicrosoft.com,则域主机名称为 contoso。等等。
- 添加连字符 (–),后跟 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 管理项目):
在进度栏消失后,您应该会看到下面的输出结果:
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,则应该会什么也看不到(当然,除非您有其他远程会话在运行):
注意: |
---|
如果您想同时关闭所有远程会话,则可以使用以下命令: 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
- 微软将推出卫星解决方案:可连接到 Azure 云服务 - 2020年9月17日
- Windows Terminal 1.0正式发布 - 2020年5月25日
- Azure Lighthouse 相关介绍 - 2020年3月2日
还没有评论