2011年8月31日水曜日

◆SharePoint、サイトコレクションを作成する

New-SPSite http://localhost/Tests/Test1 `
  -Template "STS#1" –OwnerAlias Domain\admuser `
  -Name "テストサイト1" `
  -Description "機能検証用テストサイト1" `
  -ContentDatabase WSS_Content

サイトコレクションは、New-SPSiteコマンドレットで作ることが出来る。
Templateパラメータで適用するテンプレートを指定するが、使用可能なTemplateは、Get-SPWebTemplateで参照可能だ。
image

また、OwnerAliasパラメータでサイトコレクションの管理者を指定する。
コンテンツデータベースは自前で作成して使うこともできるが今回はデフォルトで作られたWSS_Contentを指定した。

◆SharePoint、サイトに含まれるリストの一覧を取得する

PowerShell: ◆SharePointサイトコレクション配下のサイトを取得するで取得したSPWebオブジェクトはListsプロパティを持っていて、そのサイトのリストを取得することが出来る。

また、SPWebオブジェクトは、Get-SPWebコマンドレットで直接取得することも出来るようだ。

(Get-SPWeb http://gsg-svv2/sub).lists |
    ft title,itemcount -auto

image

◆SharePointサイトコレクション配下のサイトを取得する

SPSiteオブジェクトはAllWebsプロパティに配下のサイトを保持しているようだ。

Get-SPSite http://gsg-svv2/ |
  select -ExpandProperty AllWebs |
  select url,title

image

◆SharePointサイトコレクション毎のストレージ使用量を調べる

Get-SPSiteコマンドレットで返ってくるSPSiteオブジェクトは、Usage.Strageプロパティにてそのストレージ使用量が判るようだ。

Get-SPSite | Format-Table Url,@{
  name="Size(MB)"
  expression={($_.Usage.Storage/1MB).ToString("0.00")}
  Alignment="right"
} -auto

image

2011年8月30日火曜日

◆Sharepoint を操作する環境を作る

Sharepointは管理するサイトが増えてくると、後から一律設定を変更したいなんてときに結構面倒だったりする。
2010からはPowershellが使えるようになったので、そんな時も簡単に変更が出来る。はず。

という事でPowershellからのSharepoint操作を少しずつ試してみたいと思う。

まずは環境設定。
Sharepointのサーバー管理はクライアントから管理用サイトに接続しても可能なのだが、全ての設定が出来るわけではない。
なので、Powershellでの操作もサーバー側で実行するのが基本になるのでは無いかと思う。
そこで、サーバー側にPowershellの環境を作る。
サーバーにはPowershell_ISEが標準インストールされないので、サーバーマネージャーを使って追加してあげる。
image

Powershellは32ビット版と64ビット版がインストールされるのだが、Sharepointの管理には64ビット版を使うらしい。
image

次に、SharepointがインストールされたサーバーにはSharepoint管理用のSnapinもインストールされているのでこれをロードしてあげる。
image
image

毎回打つのは面倒なのでプロファイルを新規に作り登録しておく。
image

追加されたSharepoint用のコマンドレットは名詞部分の先頭にSPがつくようなので
Get-Command  -Noun  sp*
とかやると沢山のコマンドが表示される。
ちなみに、Get-SPSite と打って、サイトコレクションの一覧が取得できれば環境はOK。

2011年8月27日土曜日

◆Package Manager Console

VisualStudio2010にはJQueryが標準で組み込まれている。
バージョンは今のところ1.4.4のようだ。
巷ではすでにだいぶバージョンが進んでいて1.6.2というのが使えるようだ。

VisualStudioではバージョンアップが簡単にできるように「Add Library Packager Reference」なるツールが組み込まれて、プロジェクトのコンテキストメニューから起動することができる。
image

image

ここからJQueryを検索して「Install」を選べば現在のプロジェクトに簡単に最新バージョンの「JQuery」が組み込まれる。

ただし、今回試したところJQueryはConsoleからのインストールを要求された。
こちらはVisualStudioに組み込まれたPowershellコンソールという感じのツールで、「ツール」「Library Package Manager」「Package Manager Console」とたどるとIDEのペインの中にPowershellのコマンドプロンプトが表示される。

image
image

これには予めPackage管理用のModuleが組み込まれていて、
Install-Package JQuery
とやるだけで最新パッケージがインストールできる。

PowershellはMS製品すべての管理プラットフォームとしてなくてはならないものになってきているようだ。
この環境ではタブキー補完もポップアップで表示されるなどPowershell環境としても進化している。
image

2011年8月9日火曜日

◆ActiveDirectory、有効期限の切れるユーザーを取得する

有効期限を判定するには「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)
}

2011年8月8日月曜日

◆ActiveDirectory、Set-ADUserに関連付けられていないプロパティの更新

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条件の書き方は誤解を招きそうな気もするのであまりよろしくないのかもしれない。

◆OUのプロパティを使ってユーザーのプロパティを更新する

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」の部分文字列から取得している。(他に良い方法があるのかもしれない)

◆ActiveDirectory、最近作成されたユーザーを取得する

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」なんてプロパティがあるのだが、必ずしもユーザーが変更した場合だけに更新されるわけではなさそうなので・・・。

2011年8月2日火曜日

◆オブジェクトのキー重複を取り除く

以下のような感じで重複自体は簡単に取り除けるのだが、

PS>ps | select name | Get-Unique -AsString

これだと、プロセスオブジェクトの情報が「name」だけになってしまう。
プロセスオブジェクトの情報を保ったまま名前の重複を削除するには?

こんな感じかなぁ。

PS>ps | Group name | %{ $_.Group | select -First 1}


牟田口さんからコメントを頂きました。

ps | sort name -unique

まさにやりたかったのはこれです。ありがとうございます。すっきりしました。

何かのコマンドレットにUNIQUEパラメータがあるのは覚えていたのですがSelectだったかなぁとスルーしていました。
特定のパラメータを持ったコマンドを調べるのって何だっけ?とこれも忘れていました。
ここに書いていましたね。
image

ついでにGet-Uniqueももう少し調べてみて、今回のサンプルの例に限って言えば、ps | Get-Uniqueでも同じ結果になることが分かりました。
これは、たまたま名前順にプロセスが返ってきているのと、これもたまたまプロセスがこんな感じで
image
名前付きで返してくれるからかと思います。