New-SPSite http://localhost/Tests/Test1 ` |
サイトコレクションは、New-SPSiteコマンドレットで作ることが出来る。
Templateパラメータで適用するテンプレートを指定するが、使用可能なTemplateは、Get-SPWebTemplateで参照可能だ。
また、OwnerAliasパラメータでサイトコレクションの管理者を指定する。
コンテンツデータベースは自前で作成して使うこともできるが今回はデフォルトで作られたWSS_Contentを指定した。
New-SPSite http://localhost/Tests/Test1 ` |
サイトコレクションは、New-SPSiteコマンドレットで作ることが出来る。
Templateパラメータで適用するテンプレートを指定するが、使用可能なTemplateは、Get-SPWebTemplateで参照可能だ。
また、OwnerAliasパラメータでサイトコレクションの管理者を指定する。
コンテンツデータベースは自前で作成して使うこともできるが今回はデフォルトで作られたWSS_Contentを指定した。
PowerShell: ◆SharePointサイトコレクション配下のサイトを取得するで取得したSPWebオブジェクトはListsプロパティを持っていて、そのサイトのリストを取得することが出来る。
また、SPWebオブジェクトは、Get-SPWebコマンドレットで直接取得することも出来るようだ。
(Get-SPWeb http://gsg-svv2/sub).lists | |
SPSiteオブジェクトはAllWebsプロパティに配下のサイトを保持しているようだ。
Get-SPSite http://gsg-svv2/ | |
Get-SPSiteコマンドレットで返ってくるSPSiteオブジェクトは、Usage.Strageプロパティにてそのストレージ使用量が判るようだ。
Get-SPSite | Format-Table Url,@{ |
Sharepointは管理するサイトが増えてくると、後から一律設定を変更したいなんてときに結構面倒だったりする。
2010からはPowershellが使えるようになったので、そんな時も簡単に変更が出来る。はず。
という事でPowershellからのSharepoint操作を少しずつ試してみたいと思う。
まずは環境設定。
Sharepointのサーバー管理はクライアントから管理用サイトに接続しても可能なのだが、全ての設定が出来るわけではない。
なので、Powershellでの操作もサーバー側で実行するのが基本になるのでは無いかと思う。
そこで、サーバー側にPowershellの環境を作る。
サーバーにはPowershell_ISEが標準インストールされないので、サーバーマネージャーを使って追加してあげる。
Powershellは32ビット版と64ビット版がインストールされるのだが、Sharepointの管理には64ビット版を使うらしい。
次に、SharepointがインストールされたサーバーにはSharepoint管理用のSnapinもインストールされているのでこれをロードしてあげる。
毎回打つのは面倒なのでプロファイルを新規に作り登録しておく。
追加されたSharepoint用のコマンドレットは名詞部分の先頭にSPがつくようなので
Get-Command -Noun sp*
とかやると沢山のコマンドが表示される。
ちなみに、Get-SPSite と打って、サイトコレクションの一覧が取得できれば環境はOK。
VisualStudio2010にはJQueryが標準で組み込まれている。
バージョンは今のところ1.4.4のようだ。
巷ではすでにだいぶバージョンが進んでいて1.6.2というのが使えるようだ。
VisualStudioではバージョンアップが簡単にできるように「Add Library Packager Reference」なるツールが組み込まれて、プロジェクトのコンテキストメニューから起動することができる。
ここからJQueryを検索して「Install」を選べば現在のプロジェクトに簡単に最新バージョンの「JQuery」が組み込まれる。
ただし、今回試したところJQueryはConsoleからのインストールを要求された。
こちらはVisualStudioに組み込まれたPowershellコンソールという感じのツールで、「ツール」「Library Package Manager」「Package Manager Console」とたどるとIDEのペインの中にPowershellのコマンドプロンプトが表示される。
これには予めPackage管理用のModuleが組み込まれていて、
Install-Package JQuery
とやるだけで最新パッケージがインストールできる。
PowershellはMS製品すべての管理プラットフォームとしてなくてはならないものになってきているようだ。
この環境ではタブキー補完もポップアップで表示されるなどPowershell環境としても進化している。
有効期限を判定するには「accountExpires」プロパティを使えば良さそうだ。
試した環境では、期限が設定されていないユーザーの「accountExpires」がゼロになってるケースが何件かあったのでそれも条件に加えている。
以下では40日以内に有効期限が切れるユーザーを抽出して管理者宛にメールしている。
「accountExpires」はPowerShell: ◆ActiveDirectory、コンピュータ一覧を取得するで使ったDateTime型のメソッドを関数化して変換している。
001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 | $Month = ((Get-Date).AddDays(40)).ToFileTime() #40日後 $target = "OU=hogeOU,DC=xx,DC=giants,DC=co,DC=jp" $user = @() $user = Get-ADUser -Filter {(accountExpires -lt $Month) -and (accountExpires -ne 0)} ` -SearchBase $target -Properties accountExpires | select name,@{name="有効期限";expression={Get-I-FTime($_.accountExpires)} } $userStr = $user | fl | Out-String $body = @" ADサーバー管理ツールからの自動報告メールです。 以下のIDの有効期限が迫っています。 $userStr "@ if($user.Count){ Send-MailMessage -To "<hara_tatsunori@giants.co.jp>" ` -From "AD管理者 <admin@giants.co.jp>" ` -Subject "AD管理報告" ` -SmtpServer "mserver.giants.co.jp" ` -Body $body ` -Encoding ([System.Text.Encoding]::Default) } |
001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 | $props = ( "msDS-PhoneticDisplayName", #カナ氏名 "otherTelephone" #内線 ) $undef = @() #部、グループ名、カナ氏名、メールアドレス、内線を設定する $User | %{ $dn = $_.DistinguishedName if($emp = $obj104[$_.SamAccountName]){ #OUから会社名と部署名を取得 $ou = Get-ADOrganizationalUnit ` -Identity $dn.substring($dn.indexof(",")+1) ` -Properties description,displayname Set-ADUser -Identity $_ -Clear $props -PassThru | Set-ADUser -EmailAddress $emp.メールアドレス ` -Company $ou.DisplayName -Department $ou.Description ` -EmployeeNumber $emp.社員番号 ` -Add @{$props[0]="$($emp.カナ氏名)";$props[1]="$($emp.内線)"} }else{ $undef += $_.SamAccountName } } |
上記サンプルはスクリプトの一部を切り出したもの。
$obj104は別途管理されている社員情報から、アカウントをキーとしたハッシュテーブルとして組み立てている。
$Userは対象ユーザーを設定済み。
ユーザーの主なプロパティについてはSet-ADUserコマンドレットにて対応するパラメータが用意されているのでそれを使えば問題ない。
問題はパラメータの用意されていないプロパティを更新したい時。
ヘルプによるとその場合はRemove、Add、Replace、Clearの4つのパラメータを使用するとある。
しかし、Remove、Add、Replaceについてはどれも変更前の値を指定する必要があり単純に上書きで更新するわけには行かなそう。(コレクション型のプロパティに対応するためかなぁ・・・)
ClearしてからAddすれば良いのかと思ったが、AddとClearを同時に指定した場合はAddが先に実行されるらしい。
仕方が無いのでとりあえずはステップを分けて、ClearしてからAddすることとしたのが上記サンプルである。
もしかするともう少し直接的な設定方法があるのかもしれない。
また、書いてから気づいたが、上記if条件の書き方は誤解を招きそうな気もするのであまりよろしくないのかもしれない。
001 002 003 004 005 006 007 | Get-ADUser -Filter {whencreated -ge $span} -SearchBase $target | %{ $dn = $_.DistinguishedName $ou = Get-ADOrganizationalUnit -Identity $dn.substring($dn.indexof(",")+1) ` -Properties description,displayname Set-ADUser -Identity $_ -EmailAddress ($_.SamAccountName + "@hoge.co.jp") ` -Company $ou.DisplayName -Department $ou.Description } |
前回取得したユーザーにOUから取得したプロパティを使って更新してみる。
OUは基本的に組織内の部署と同じ構造にしてあるので部署名などはOUから持ってきて自動でセットしたいという思い。
OUのどのプロパティを使うのが適切なのか今ひとつ判断できなかったので、とりあえずは「description」と「displayname」を使った。
また、取得したユーザーから所属するOUの取得方法が判らなかったので「DistinguishedName」の部分文字列から取得している。(他に良い方法があるのかもしれない)
001 002 003 004 | $span = (Get-Date).AddDays(-7) #過去1週間 $target = "OU=hoge,DC=hoge,DC=company,DC=co,DC=jp" Get-ADUser -Filter {whencreated -ge $span} -SearchBase $target |
「whenCreated」プロパティでフィルターしてあげると良いようだ。
本当は最近変更されたユーザーを取得したかったのだが、それらしいプロパティを見つけられなかった。
「whenChanged」なんてプロパティがあるのだが、必ずしもユーザーが変更した場合だけに更新されるわけではなさそうなので・・・。
以下のような感じで重複自体は簡単に取り除けるのだが、
PS>ps | select name | Get-Unique -AsString |
これだと、プロセスオブジェクトの情報が「name」だけになってしまう。
プロセスオブジェクトの情報を保ったまま名前の重複を削除するには?
こんな感じかなぁ。
PS>ps | Group name | %{ $_.Group | select -First 1} |
ps | sort name -unique
まさにやりたかったのはこれです。ありがとうございます。すっきりしました。
何かのコマンドレットにUNIQUEパラメータがあるのは覚えていたのですがSelectだったかなぁとスルーしていました。
特定のパラメータを持ったコマンドを調べるのって何だっけ?とこれも忘れていました。
ここに書いていましたね。
ついでにGet-Uniqueももう少し調べてみて、今回のサンプルの例に限って言えば、ps | Get-Unique
でも同じ結果になることが分かりました。
これは、たまたま名前順にプロセスが返ってきているのと、これもたまたまプロセスがこんな感じで
名前付きで返してくれるからかと思います。