22
PowerShellSharePointいじってみよう 2012.3.31 JPSPS#2 アンクの山本

[東京] JapanSharePointGroup 勉強会 #2

Embed Size (px)

DESCRIPTION

株式会社アンクの山本さんのPowerShellセッション

Citation preview

Page 1: [東京] JapanSharePointGroup 勉強会 #2

PowerShellでSharePointを いじってみよう

2012.3.31 JPSPS#2 アンクの山本

Page 2: [東京] JapanSharePointGroup 勉強会 #2

自己紹介

• 山本太月 30代後半

• 株式会社 ANK : SharePoint開発チーム

• 元自動車整備士、妻1人娘2人

• Twitter: @SharePoint_X

• Facebook:https://www.facebook.com/sharepointx

Page 3: [東京] JapanSharePointGroup 勉強会 #2

今日の目標とお願い • まだ使ったことが無い方に

「何かPowerShellってよさそうだな」

と感じてもらう

• 少し触ったことがある方に

「それ使えるかも」

という小ネタの提供

• タイトルと内容に違和感がある方に

細かいところは気にしないで頂きたい

• リアクションがあるとやりやすい

Page 4: [東京] JapanSharePointGroup 勉強会 #2

目次 1. PowerShellの基本

1. ツール、環境 2. コマンド 3. 関数、コマンドレット

2. PowerShellでSharePointの操作、アクセス 1. SharePointのコマンド、オブジェクト 2. 構築編 for ITPro 3. 管理運用編 for Administrator 4. 開発編 for Developer

3. デモ 1. .Net資産活用 2. リストアイテムをExcelへ(Office365対応) 3. プッシュ配信型のお知らせ(未完)

Page 5: [東京] JapanSharePointGroup 勉強会 #2

基本① ツール、環境 • [Windows PowerShell]

– 全てのプログラム>アクセサリ>Windows PowerShell

• [SharePoint 2010 管理シェル] 実体は> (SPhive)¥CONFIG¥POWERSHELL¥Registration¥sharepoint.ps1

$Host.Runspace.ThreadOptions = “ReuseThread“ Add-PsSnapin Microsoft.SharePoint.PowerShell

• [Windows PowerShell ISE] ・・・ 統合開発環境 Import-Module Servermanager Add-WindowsFeature PowerShell-ISE

• Profile でパーソナライズ $profile CurrentUserCurrentHost, CurrentUserAllHosts, AllUsersCurrentHost, AllUsersAllHosts

• Set-ExecutionPolicy で実行ポリシーを指定 Restricted、 AllSigned 、 RemoteSigned、 Unrestricted

Page 6: [東京] JapanSharePointGroup 勉強会 #2

基本② コマンド • まずは Get-Command、 Get-Help、Get-Member

gcm、man、gm

• コマンド名は動詞(Verb)と名詞(Noun)

例) Get-Command –Noun SP* で、SharePoint関連のコマンド一覧取得

• コレクション操作 Select-Object(%、-Property、-First、-Last、etc.) Where-Object(?)、 Sort-Object、 Group-Object、 Measure-Object

• 出力 Write-Host、 Write-EventLog、 Write-Progress、 Out-File、Export-Csv 、 Export-Clixml、 Out-Null、 Format-List、Format-Table、Out-GridView、 etc.

Page 7: [東京] JapanSharePointGroup 勉強会 #2

基本③ 関数・コマンドレット

• Function、filter、{} (ScriptBlock) – 引数の指定 function Get-Money( [string] $Target , [long] $Amount){…} $args と $input、param($City, $Street, $Address)

• Script(*.ps1)、 Module(*.psm1) – 引数の指定 : $args と $input、param($City, $Street, $Address) – 呼び出し: “.”(ドット)or “&” + ファイルパス、Import-Module 関数は先(上)にインプリしないと使えません!

• デバッグ、性能測定、ロギング – Write-Verbose と $VerbosePreference = "Continue” – Set-PSDebug、Set-PSBreakpoint、Get-PSCallStack – Start-Transcripts ・・・証跡、Measure-Command ・・・パフォーマンス測定

• カスタムPSSanpin – Visual Studioで作成し、インストールする。(ので面倒)

Page 8: [東京] JapanSharePointGroup 勉強会 #2

PS と SharePoint① コマンド、オブジェクト

• gcm -noun sp* で、名詞が SPで始まるコマンド – 562個のコマンド(209個のNoun≒オブジェクト)

• オブジェクトは.Net ObjectModelとイコールのものが多い 例) $web = Get-SPWeb http://spx01/

$web.GetType().FullName > Microsoft.SharePoint.SPWeb

• .Net OMとイコールのものはAPIをそのまま使用できる 例) $web.GetList(“/Lists/Announcements”)

• .Net OMのAPI(メソッド)とPowerShellのコマンドの違い

PowerShellのコマンドは一発屋! Set系のコマンドは Update が不要(なことが多い)

• メモリー管理

– Dispose、Start-SPAssignment、 Stop-SPAssignment

Page 9: [東京] JapanSharePointGroup 勉強会 #2

PS と SharePoint② 構築のお手伝い(1) • インストール ~ 構成ウィザード

– 構成ウィザード(PSCONFIG*.exe)での操作は× ※PowerShellコマンドは無いけどexe起動はできる!

– 基本的にはなんでもできる。が、デザインやページの編集は苦手。

• [CodePlex] AutoSPInstaller http://autospinstaller.codeplex.com/

• [MS-DownloadCenter] SPModule http://www.microsoft.com/download/en/details.aspx?id=6194

• ファームの作成 • 全体管理サイト作成 • サービスアプリケーション作成 • Webアプリケーション作成 • コンテンツDB作成

• サイトコレクションの作成 • サイトの設定 • リストの作成 • 初期アイテムの投入

Page 10: [東京] JapanSharePointGroup 勉強会 #2

PS と SharePoint② 構築のお手伝い(2)

• UIから操作できない設定変更が可能 – WebProperties に独自の設定値を保存

–特定の列の非表示化 (ShowInDispForm)

– SPDが勝手に書き換えるXSLを生で注入

–任意のリストにイベントレシーバーを設定

– WebConfigの書き換え

– コンテンツソースのクロールスケジュールをより詳細に設定

• [TechNet] ファームの構成設定を文書化する http://technet.microsoft.com/ja-jp/library/ff645391.aspx

Page 11: [東京] JapanSharePointGroup 勉強会 #2

PS と SharePoint③ 運用のお手伝い(1) • バックアップ&リストア

– STSADMの代替 [TexhNet] Stsadm と Windows PowerShell 間のマッピング

• サービスアプリケーションの管理 – 死活監視、再起動、トポロジーの変更 リモーティング:

• ジョブ&バッチ処理 – タスクスケジューラー

[CodePlex] SharePoint PowerShell Timer Jobs http://sppowershelltimerjob.codeplex.com/

Page 12: [東京] JapanSharePointGroup 勉強会 #2

PS と SharePoint③ 運用のお手伝い(2)

• ULS&イベント&IISのログ監視(収集) – Merge-SPLogFile

ファームの全SharePointサーバーのULSログを収集してマージ

• 利用状況の監視

• リストアイテムの操作、ドキュメントの管理、 権限管理

• メール送信 – 例)昨日投稿されたアイテム一覧を毎朝配信

Page 13: [東京] JapanSharePointGroup 勉強会 #2

PSとSharePoint④ 開発のお手伝い • 開発・検証環境の構築

• ブラウザUIでは見られない情報の確認、変更

– 非表示列、非表示リストを一時的に表示 – 隠しフィーチャーの状態管理 – ファームソリューションの取得

• テスト&デバッグ – 大量データやイレギュラーデータの作成

• コンソールアプリの代わりに – Add-Type コマンド最強

Page 14: [東京] JapanSharePointGroup 勉強会 #2

Demo①

Add-Typeで資産活用!

Page 15: [東京] JapanSharePointGroup 勉強会 #2

#Setting $targetSiteUrl = "http://spx01/" $targetListName = "TestBigList" # Add SharePoint snapin Add-PSSnapin Microsoft.SharePoint.PowerShell $src = @" using Microsoft.SharePoint; namespace JpSps { public class ItemGetter { public static SPListItemCollection gets(SPList list, uint rowNum) { SPQuery qry = new SPQuery(); qry.RowLimit = rowNum; return list.GetItems(qry); } } } "@ $asmName = [Microsoft.SharePoint.SPWeb].Assembly.FullName # Regist class Add-Type -TypeDefinition $src -ReferencedAssemblies $asmName # Get SPList $web = Get-SPWeb $targetSiteUrl $list = $web.Lists[$targetListName] [JpSps.ItemGetter]::gets( $list, 100 ) | Select-Object -Property ID, Title, @{Name="作成者"; Expression={($_["作成者"].Split(";")[1]).TrimStart("#")}} ` | Out-GridView -Title "Demo successful" $web.Dispose()

Demo① - (1/1)

Page 16: [東京] JapanSharePointGroup 勉強会 #2

Demo②

リストの内容を

クライアントから取得

そしてExcel出力! (CSVじゃないよ)

Page 17: [東京] JapanSharePointGroup 勉強会 #2

# Setting ---------------------- $siteURL = "https://jpspsp1.sharepoint.com" $listID = "{93B94918-C6BB-4550-BFC1-750CC5955B39}" $query = "SELECT TOP 100 * FROM list" # Constants Set-Variable -name connectionStringForSP -value "Provider=Microsoft.ACE.OLEDB.12.0;WSS;IMEX=2;RetrieveIds=Yes;DATABASE=$siteURL;LIST=$listID;" ` -option constant # By ADO ---------------------- # Create Connection $cn = New-Object -ComObject ADODB.Connection $cn.Open($connectionStringForSP) # Get Recordset $rs = $cn.Execute($query) # Fetch the data [Array]$retTable = @() $rs.MoveFirst() Do { $objRow = New-Object -TypeName PSObject # Field to Member $rs.Fields ` | ForEach-Object{ ` Add-Member -MemberType NoteProperty -InputObject $objRow ` -Name $_.Name -Value $rs.Fields.Item($_.Name).Value ` } $retTable += $objRow $rs.MoveNext() } Until ($rs.EOF -eq $True) # Finalize $rs.Close() $cn.Close() # Show the stolen data. $retTable | Out-GridView

Demo② - (1/2)

Page 18: [東京] JapanSharePointGroup 勉強会 #2

# By ADO.net ---------------------- # Create connection $conSP = New-Object System.Data.OleDb.OleDbConnection($connectionStringForSP) $conSP.Open() # Create data adapter $daSP = New-Object System.Data.OleDb.OleDbDataAdapter($query, $conSP) # Create datatable (container of the stolen data) $dtSP = New-Object System.Data.DataTable # Steal the data $daSP.Fill($dtSP) > $null # Finalize $conSP.Close() # Show the stolen data. $dtSP | Out-GridView # Export to Xlsx ---------------------- # Additional Setting -------- #$pathXls = "C:¥Data_{0:yyyyMMdd_HHmmss}.xlsx" -f (Get-Date) $pathXls = "C:¥Users¥Tatsuki¥Dropbox¥JPSPS¥Data_{0:yyyyMMdd_HHmmss}.xlsx" -f (Get-Date) # Open connection $conSP.Open() # Create command (New-Object System.Data.OleDb.OleDbCommand( "SELECT TOP 5500 * INTO [Excel 12.0 Xml;Database=$pathXls].[fromSP] from [list]" ` ,$conSP)).ExecuteNonQuery() # Finalize $conSP.Close()

Demo② - (2/2)

Page 19: [東京] JapanSharePointGroup 勉強会 #2

Demo③

プッシュ配信

Page 20: [東京] JapanSharePointGroup 勉強会 #2

・サーバーに配置するScript(デモ時はコンテンツエディタで配置)

<script type="text/javascript“> var maxId = -1; // これまでに取得したリストアイテムIDの最大値 var ListName = "PushAlerts"; // リスト表示名 var pollingInterval = 10000; // 繰り返しインターバル(On-Premisesでは大き目、Office365では小さ目が吉) var context; var web; var list; var items; var item; var currentId; var currentTitle; var currentBody; var itemDic = {}; var currentStatusId = ""; function startGetAllItems() { // 定期的にリストからアイテムを取得 setInterval(function (){ items = null; itemDic = {}; context = SP.ClientContext.get_current(); web = context.get_web(); list = web.get_lists().getByTitle(ListName); items = list.getItems(SP.CamlQuery.createAllItemsQuery()); // すみません、このあたり手抜きです(汗 context.load(items); context.executeQueryAsync(Function.createDelegate(this, getAllItemsSuccess), null); }, pollingInterval ); } function getAllItemsSuccess(sender, args) { var _maxId = 0; var listEnumerator = items.getEnumerator(); while (listEnumerator.moveNext()) { // 取得したアイテムをDictionaryに入れつつ最大(=最新)のIDを調査 item = listEnumerator.get_current(); currentId = item.get_item("ID"); currentBody = item.get_item("Body"); if(_maxId < currentId){_maxId = currentId} itemDic[currentId] = currentBody } if(maxId != -1 && maxId < _maxId){ // 最大のIDが前回取得時を上回っていた場合は、ステータスを更新 if(currentStatusId != "") SP.UI.Status.removeStatus(currentStatusId); currentStatusId = SP.UI.Status.addStatus(itemDic[_maxId]); } maxId = _maxId; // 最大のIDを保持 } _spBodyOnLoadFunctionNames.push("startGetAllItems"); // ページ読込み時に起動 </script>

Demo③ - (1/1)

※この例では、 「Body」という名の列を持つ、「PushAlerts」という名の

リストを作成し、アイテムを追加することでBoby列の内容がPush風に配信されます。 全然PowerShellと絡めてない(汗

Page 21: [東京] JapanSharePointGroup 勉強会 #2

Resources

• SharePoint Management PowerShell Scripts http://sharepointpsscripts.codeplex.com/

• SharePoint Server 2010 Search: Windows PowerShell cmdlets http://social.technet.microsoft.com/wiki/contents/articles/ 204.sharepoint-server-2010-search-windows-powershell-cmdlets-en-us.aspx

• Windows PowerShell compiled Help for SharePoint Server 2010 http://www.microsoft.com/download/en/details.aspx?id=7879

• The Windows PowerShell Toolbox http://technet.microsoft.com/en-us/scriptcenter/ee861518

• Windows PowerShell Quick Reference http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=7097

• SharePoint Server 2010 向けの Windows PowerShell http://technet.microsoft.com/ja-jp/library/ee662539.aspx

• Stsadm と Windows PowerShell 間のマッピング http://technet.microsoft.com/ja-jp/library/ff621084.aspx

Page 22: [東京] JapanSharePointGroup 勉強会 #2

Communities

• PowerShellCommunity.org

http://www.powershellcommunity.org/

• PowerShell.com

– Library、 eBooks(free)、Ask the Experts

– Today’s tips

http://powershell.com/

• PowerShell Community Groups

http://powershellgroup.org/