2013年12月5日,星期四

在Office 365中的PowerShell脚本中使用CSOM

在我最近“Office 365开发人员的决定,技巧和窍门”我说过我们’d做了很多“PowerShell with CSOM” work, and this was enabling us to run scripts against SharePoint 线上 in the same way that we are used to (for on-premises SharePoint). 这个 is becoming a popular approach, but since I got questions on it I thought it worth writing about.

刚开始使用Office 365时,我记得我非常担心缺少PowerShell cmdlet–基本上我们所有的命令’习惯使用那里不存在。这里’一个免费的图形来说明这一点:

图片

是的,SP2013中的将近800个PowerShell命令(从SP2010中的530个左右)减少到SharePoint 线上中的仅30个。这30个主要涵盖网站,用户和权限的基本操作–没有托管元数据,用户个人资料,搜索等脚本。它’可以肯定地说,其中有些东西现在可以在网站收集范围内使用(当然,当您不这样做时,’t have a true “Central Admin”网站,但仍然“tenant-level”您想要使用脚本而不是通过UI进行手动更改的设置。

所以呢’开发人员/管理员做的不好吗?

答案是像往常一样编写PowerShell,但是将CSOM代码嵌入其中。稍后会有更多示例,但是这里’一个小插图:

#获取网站集范围内的功能集(例如,激活一个)–这里没有显示如何获取$ clientContext。
$ siteFeatures = $ clientContext.Site.Features
$ clientContext.Load($ siteFeatures)
$ clientContext.ExecuteQuery()

所以我们’重新使用.NET CSOM,但我们使用的是PowerShell,而不是C#’调用任何.NET对象的能力(实际上,几乎每个脚本都将使用PowerShell’s 新对象 命令)。我们开始喜欢PowerShell的所有东西都重新摆在桌子上:

  • 可以轻松修改脚本,而无需重新编译(或打开Visual Studio)
  • 我们可以使用PowerGui或PowerShell ISE进行调试
  • 我们可以利用PowerShell擅长的其他方面使用其他PowerShell模块和其他API(包括.NET)等可以轻松地从XML文件读取。

当然, 我们只能在.NET CSOM中存在该方法的地方执行操作 – that’是我们能做的事的界限。

入门

第1步–了解风景

The first thing to understand is that there are actually 3 different approaches for scripting against Office 365/SharePoint 线上, depending on what you need to do. It might just be me, but I think that when you start it’它们之间容易混淆,或者无法完全理解它们全部存在。我的三种方法’m thinking of are:

  • SharePoint 线上 cmdlets
  • MSOL cmdlet
  • PowerShell + CSOM

这个 帖子着重介绍最后的味道。我还写了一篇简短的随笔文章,内容涉及整体情况,以及其他口味的一些细节/示例,网址为 Using SharePoint 线上 and MSOL cmdlet in PowerShell with Office 365

第2步– prepare the machine you will run scripts against SharePoint 线上

选项1-如果您不会从SP2013框(例如SP2013 VM)运行脚本,请执行以下操作:

您需要获取包含.NET CSOM的SharePoint DLL。, and copy them to a folder on your machine –您的脚本将引用这些DLL。

  1. 转到任何SharePoint 2013服务器,并复制任何DLL
  2. 该文件以C. \ Program Files \ Common Files \ microsoft shared \ Web服务器扩展\ 15 \ ISAPI文件夹中的Microsoft.SharePoint.Client * .dll开头。
  3. 将它们存储在计算机上的文件夹中C:\ Lib–记录此位置。

CSOM DLL

选项2-如果要从SP2013框(例如SP2013 VM)运行脚本,请执行以下操作:

在这种情况下,无需复制DLL。–您的脚本将在原始SharePoint安装位置(C:\ Program Files \ Common Files \ microsoft shared \ Web服务器扩展\ 15 \ ISAPI)中引用它们。

脚本顶部–引用DLL和身份验证

在使用API​​之前,每个调用SharePoint CSOM的.ps1文件都需要处理两件事。–加载CSOM类型,并认证/获取ClientContext对象。那么你’在脚本顶部需要此代码:

** N.B.我较新的代码示例未在RSS阅读器中显示- 点击这里查看全文 **

在下面的脚本中,我们’ll include this “top of script”在下面的每个脚本中通过点置TopOfScript.ps1来填充内容–您可以采用类似的方法(也许使用不同的名称!),也可以将这些内容粘贴到您创建的每个脚本中。如果您输入了一组有效的凭据和URL,运行上面的脚本应该会发现您已经准备就绪:

PS CSOM具有上下文

脚本示例

在SPO中激活功能

您可能需要在某个时候执行的操作是使用脚本启用或禁用功能。下面的脚本和后面的脚本一样,都引用了我上面的TopOfScript.ps1脚本:

** N.B.我较新的代码示例未在RSS阅读器中显示- 点击这里查看全文 **

PS CSOM激活功能

Enable 侧装 (for app deployment)

沿着非常相似的思路(因为它还涉及激活功能)是启用“side-loading”在网站上。默认情况下,如果您’重新开发SharePoint应用程序时,只能将其从Visual Studio F5部署到通过“开发人员网站”模板创建的网站,但要启用“side-loading”您也可以在(例如)团队网站上进行操作。由于功能不是’在用户界面中可见,您’需要一个这样的脚本:

** N.B.我较新的代码示例未在RSS阅读器中显示- 点击这里查看全文 **

PS CSOM启用侧面加载

迭代网

有时,您可能想遍历网站集中的所有网站,或在特定网站的下方浏览:

** N.B.我较新的代码示例未在RSS阅读器中显示- 点击这里查看全文 **

PS CSOM迭代网

(请注意,在上图中,您还可以看到SharePoint托管的应用程序网络,因为它们只是子网站(尽管可以通过应用程序域URL而不是实际主机站点进行访问)’的网络应用程序网址)。

迭代Web,然后列出,并更新每个列表上的属性

还是将上述示例扩展为不仅迭代Web,而且迭代每个Web列表-我在每个列表上更新的属性是EnableVersioning属性,但您可以通过相同的方式轻松使用任何其他属性或方法:

** N.B.我较新的代码示例未在RSS阅读器中显示- 点击这里查看全文 **

 PS CSOM迭代列表启用版本控制

导入搜索架构XML

在SharePoint 2013和Office 365中,搜索配置的许多方面(例如托管属性和爬网属性,查询规则,结果源和结果类型)可以作为XML文件在环境之间导出和导入。以下示例显示了使用PS + CSOM处理的导入操作: 

** N.B.我较新的代码示例未在RSS阅读器中显示- 点击这里查看全文 **

PS CSOM导入搜索架构

概要

如您所愿,那里’使用PowerShell和CSOM组合可以完成很多工作。可以使用CSOM API进行的所有操作都可以包装到脚本中,并且可以像过去一样建立有用的PowerShell代码段库。 您无法使用CSOM做一些有趣的事情(例如,自动化将沙盒WSP上传/部署到Office 365的过程),但是有解决这些问题的方法,我’在以后的文章中,很可能会涉及到这一点(以及我们的经验)。

在PowerShell + CSOM方面的最终想法是,您可以拥有“hybrid”可以同时处理SharePoint 线上和本地SharePoint的脚本。例如,在我当前的项目中,我们构建的所有内容都必须可部署到SPO和本地,并且脚本使用“DeploymentTarget”参数可以在其中的值“Online” or “OnPremises”。脚本之间存在一些差异(即分支),但是对于许多操作,可以运行相同的命令。

相关帖子- Using SharePoint 线上 and MSO cmdlets in PowerShell with Office 365

14条评论:

布鲁斯说过...

好东西!非常感谢您分享克里斯。它'有一个问题是,我有一个问题时我会首先进入您的博客,而不是对其进行搜索……不确定对技术博客是否会有更高的赞誉:-)

盖伊说过...

感谢提供这篇好文章。一个问题:"您需要获取包含.NET CSOM的SharePoint DLL。"这与SharePoint 2013的客户端SDK相同吗,它是Visual Studio 2013 Pro安装的一部分?

克里斯·奥'Brien说过...

@GuyD,

是的,的确如此,感谢您指出这一点-我'd忘记了此选项。客户端SDK实际上是一个不错的选择"packaged"安装程序安装这些DLL的集合。您可以使用Visual Studio或作为独立/可再发行安装程序来获取它。

谢谢,

克里斯。

未知说过...

非常感谢这篇文章。这对我有很大帮助。
我正在尝试同时设置主要版本的数量,但它表示majorversionlimit没有't退出在线Sharepoint。你不'碰巧知道365上的属性名称是什么吗?

谢谢
标记

克里斯·奥'Brien说过...

@标记,

好吧'绝对是SPList类上的属性的名称-如果不存在'在SPO中无法正常工作,可能是该属性在此处被阻止(第一个示例I'我听说过)。

其他想法:-

-可能是您输入的大写字母(或拼写错误)吗?
-或者是您正在使用JavaScript CSOM,并且需要诸如set_MajorVersionLimit之类的东西?

干杯,

克里斯。

未知说过...

我正在尝试在租户级别导入搜索设置,但遇到如下所示的问题

异常调用"ExecuteQuery" with "0" argument(s): "拒绝访问。您没有执行此操作或访问此资源的权限。"
在\ PowerShell Scripts \ Import.ps1:38 char:1
+ $ clientContext.ExecuteQuery()
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo:未指定:(:) [],MethodInvocationException
+ FullyQualifiedErrorId:ServerUnauthorizedAccessException

我们可以通过PowerShell在租户级别导入自定义搜索设置吗?

另外,我能够通过租户级别的UI手动导入

未知说过...

@Rohit,

我必须从控制台收集密码以防止该错误。

$ securePassword =读取主机-提示"$ username的密码" -AsSecureString

克里斯,好帖子!
托比

摩西·乔希说过...

克里斯,你好

Can we create/modify Managed Properties and crawled properties using this approach on SharePoint 线上?

克里斯·奥'Brien说过...

@Mohit,

是的,您可以通过使用PS / CSOM导入搜索架构XML来执行此操作,该XML创建/更新托管属性,已爬网属性,映射等。

我在这里有一个代码示例: //gist.github.com/chrisobriensp/7779915

干杯,

克里斯。

匿名 said...

非常感谢这篇出色的文章。

//gist.github.com/chrisobriensp/7779915 - 这个 link is broken. Can you please fix the link. Thankyou!!

克里斯·奥'Brien说过...

@freddiemaize,

嗯,我刚刚检查了一下,链接对我来说正常吗?你可以重新检查一下吗?

谢谢!

COB。

未知说过...

这是好东西!感谢您的发表。但是,我'我在遍历我的网站网站集时遇到了麻烦。我需要为所有个人子站点设置我们的自定义母版页,但是当我运行命令时却没有't return anything. I'm我们公司在Office 365环境上的Global Admin。任何想法将不胜感激。先感谢您!

托尼普说过...

非常有趣的帖子,谢谢分享!
您建议使用什么软件来编写复杂的Powershell CSOM?是否有任何包含DLL的IntelliSense的软件?

费尔南多·塞拉亚说过...

很棒的指南!确实帮助我升级了SPO游戏:)