元ネタ:せっかくだから、PowerShellで書いてみた。全ユーザ一覧の取得方法
よくよく見ると、以前のリストだとコンピュータアカウントも混じることがあったようです。
さっくりコンピュータアカウントをLDAPのフィルタで外します^^;
$ADs = New-Object System.DirectoryServices.DirectorySearcher
$ADs.Filter = "(&(objectClass=user)(!(objectClass=computer)))"
$Users = $ADs.FindAll() | foreach {$_.GetDirectoryEntry()}
元ネタ:窓の杜 - 【NEWS】“Windows Phone Marketplace”に変更、「Zune Software」のアプリ購入機能が削除
http://www.forest.impress.co.jp/docs/news/20120426_529550.html
Zuneは、端末自体のアップデートや画像・動画の動機には使えるけれど、アプリの管理はここからするのではなくなるそう。
Webサイトで買っても、Zuneが使えないと結局メール経由で端末からインストールすることになるのですが、
端末自体が十分速いのでそんなにストレスはありません。
ただ、PCにさしっぱなしでインストールできなくなったことは、若干不便に感じます。
■従来
Windows Marketplaceでのアプリの検索と購入 | Windows Phone Marketplace
http://www.microsoft.com/windowsphone/ja-jp/howto/wp7/apps/find-and-buy-apps-in-marketplace.aspx
上記ページに載ってるZuneの画面

今起動したときの状態

マーケットプレースがビデオだけになってました。
現在のところ、それなりに回線速度が出ているので、あまり不満は感じませんが、
動画はやっぱり滑らかに見たい。
ということで、やっとIS12TでもWiFi接続サービスが利用できるようになりました^^
さて、途中au IDを聞かれますが、これはIS12Tユーザーなら使っているであろう、
ezmailをGMAILで見ることのできるauoneのIDと同じものでした^^。
まだ作っていない方は是非。
「auポータル - au携帯とPCが一体化したポータルサイト」
http://auone.jp
auのメールアプリよりサクサクメールが見られます。
(ただ、携帯からのメールに返信すると全部件名が?????に化けますorz)
元ネタ:auスマートフォン IS12T | 利用方法 | au
http://au.kddi.com/wifi/au_wifi_spot/riyo/smartphone/is12t.html
そろそろD25HWが丸2年で満了するため、解約しようかなぁと思っていたら、GL01Pへの乗換キャンペーンがあったので入手してみた。
おうち(大阪市内)で10Mbps出てる^^。WiMAXが300kbps位だったので、いい意味で期待を裏切られました。
さて、FTTHに接続しているWiFiを計測したらなんと7Mbps。自宅のWiFiより速いでやんの
なんせ、WiFiルータはまだ11gの規格が固まるかどうかの時代のものですから……。
いちおう、54Mbpsでリンクはしているのですが、おそすぎ><
WiFiルータまでは60Mbps位出ていたので、WiFiルータのせいで間違いなさそう。
速攻AmazonでWiFiルータぽちってきましたとも・・・orz
旧年中は、いろいろな方にお世話になり誠にありがとうございました。
本年もどうぞよろしくお願いします。
先ほど、おめでとうございますTLを済ませた後、ダメもとで見てみたら、私のところにもMVP受賞に関するメールが。
これも皆様のおかげです。重ねてありがとうございましたm(_ _)m
#英語のメールかと思ったら、日本語なんですね^^;
PowerShell Advent Calendar 2011の第二回っす。
元ネタ:PowerShellでれっつログオン監査
システム間で連携を行うとき、いろいろな技術はありますが常々感じるのは、いまだに
「CSV最強伝説継続中!!」。
CSVの良さは、とりあえずテキストファイルで読めるし大概のシステムで読める、ということだと思います。
しかし、開発者は置いておいて、保守管理の人に言わせれば「CSVなんて大っ嫌い」という方も多いと思います。
ともかく、CSVはデータの羅列を各自が勝手に判断するため、以下のような特徴があります
・並び順が重要
・各列がなんのデータが分かりにくい
・データ形式によってはうまく取り込めない
誰かが勝手にデータデータを追加してたり、列の形式を変更してしまったらもうお手上げです。
CSVファイル自身にも先頭をタイトル行として何のデータかを管理したりするのですが、コレの手入れとメンテナンスはとても面倒です。
そこで、PowerShellのオブジェクトが大活躍します!!!
昔のバッチ風に書いてみましょう
---PS-Test1.ps1
Write-Host ID,Name -Separator ","
Write-Host 1,なかさん -Separator ","
Write-Host 2,ちゅき -Separator ","
---
これをリダイレクトしてCSVを作れます……(なんも良くないじゃないか!!!)
では、オブジェクトを作ってみましょう
--PS-Test2.ps2
$objArray = New-Object System.Collections.ArrayList
$objUsers = New-Object PSObject | Select-Object ID,Name
$objUsers.ID = 1
$objUsers.Name = "なかさん"
[void]$objArray.Add($objUsers)
$objUsers = New-Object PSObject | Select-Object ID,Name
$objUsers.ID = 2
$objUsers.Name = "ちゅき"
[void]$objArray.Add($objUsers)
$objArray
---
>PS-Test2.ps1
ID Name
-- ----
1 なかさん
2 ちゅき
----
で、これがどうしたいう話なのですが以下のように突っ込むと、そのままオブジェととして渡せて、しかもタイトル行のついたCSVをはいてくれるのですごい楽なんです。
CSVを作って中身を見てみる
そのまま、オブジェクトとして渡せたり出来る素晴らしさ!!!
_________________________
PS > $obj = .\PS-TEST2.ps1
_________________________
PS C:\Documents and Settings\manabe.COMTEST\デスクトップ> $obj | Export-Csv .\test.csv -Encoding UTF8
_________________________
PS C:\Documents and Settings\manabe.COMTEST\デスクトップ> Get-Content .\test.csv
#TYPE Selected.System.Management.Automation.PSCustomObject
"ID","Name"
"1","なかさん"
"2","ちゅき"
そして、このままCSVで列の名前を付けたままインポートを行うことができます。
CSVをインポートする
これはスゲー便利^^(なんったて、利用の時いちいち仕様書にらめっこしなくても、とりあえず読んでGet-Memberすれば何かわかる幸せ
_________________________
PS C:\Documents and Settings\manabe.COMTEST\デスクトップ> $objImportArray = Import-Csv -Path .\test.csv
_________________________
PS C:\Documents and Settings\manabe.COMTEST\デスクトップ> $objImportArray
ID Name
-- ----
1 なかさん
2 ちゅき
さて、これを一体何に使うのか…
で、これを一体何に使うかということですが、この前の監査ポイやつをこんな風にしておくと、後々楽だったりします
----PS-Test3.ps1
#保存用の配列
$objArray = New-Object System.Collections.ArrayList
#イベント取り込み
$objSecLog =Get-WinEvent -FilterXPath `
"Event[System[Provider[@Name='Microsoft-Windows-Security-Auditing'] `
and (EventID='4624' or EventID='4634')] `
and EventData[(Data[@Name='LogonType']='2' or Data[@Name='LogonType']='10')]]"
#取り込んだだけループ
foreach($objEvent in $objSecLog ){
#保存したいデータを入れておくオブジェクト
$objEventItem = New-Object PSObject | Select-Object LogTime,EventID,IpAddress,DomainName,UserName,Message
#各イベントで共通の値を代入
$objEventItem.LogTime = $objEvent.TimeCreated
$objEventItem.EventID = $objEvent.id
#そのまま取り込めないため、XMLでゴニョゴニョ
$objXML = [xml]$objEvent.ToXML()
switch($objEventItem.EventID){
"4624"{
$objEventItem.IpAddress = (([xml]$objXML).Event.EventData.Data | ?{$_.Name -eq 'IpAddress'}).get_innerXML()
$objEventItem.DomainName = (([xml]$objXML).Event.EventData.Data | ?{$_.Name -eq 'TargetDomainName'}).get_innerXML()
$objEventItem.UserName = (([xml]$objXML).Event.EventData.Data | ?{$_.Name -eq 'TargetUserName'}).get_innerXML()
$objEventItem.Message = "ログオン"
}
"4634"{
$objEventItem.IpAddress = ""
$objEventItem.DomainName = (([xml]$objXML).Event.EventData.Data | ?{$_.Name -eq 'TargetDomainName'}).get_innerXML()
$objEventItem.UserName = (([xml]$objXML).Event.EventData.Data | ?{$_.Name -eq 'TargetUserName'}).get_innerXML()
$objEventItem.Message = "ログオフ"
}
}#EndSwitch
$objArray.Add($objEventItem)
}#Next
$objArray
----
ともかく、タイトル行とデータがずれないのだけでもすごく助かります。ともかく、エクスポートしたものをインポートできるという安心感は保守や管理者の大きな味方になってくれるはずです。
みんな大好きなVisual Basicのなかでも、愛して已まないのはやっぱり「Nothing」ですよね☆
もう、こんなカワイイじゃじゃ馬っ娘と暮らしたら、離れなれなくなります。
普段はあんまり遊んであげられなのですが、こんなホリデーシーズンにはNothingで遊んであげましょう。
そう、これはVisual Basic Advent Calendar 2011の一環です。
難しい話題はMVPの方にお任せして、またーり遊んでみましょう☆
(師走で死ぬほど忙しい、とかいうのはこの際目をつぶってくださいw)
では、Visual BasicでNothingとはどんなものでしょうか。MSDNで見るとずばり
「Nothing:任意のデータ型の既定値を表します。」
nothingの日本語訳は「何もない」のハズです。すでに訳が分かりませんね^^;
挑戦1、そのまま表示したら何がでるかな?
ということで、「Console.WriteLine(Nothing)」をやってみました。
もうね、コンパイラさんの頑張りに申し訳なさでいっぱいです

挑戦2、既定値なんだよね?
せっかく上記でいろんな型が出てきたので、あそんでみませう。
.NETでは、サフィックスをつけると型を明示できます。ということで遊んでみるなど。
まずは、数値。
既定値は0なので、以下で「True」が返ってくるのは想定内。
ちなみに、=を二つ並べなくったって、VBでは”=”一個だけだと比較です。(このせいで、λ式とかめんどっちいことにorz)

調子に乗って。もう、C系の人からぶんなぐられそうですw
VBerの皆さん。数学的にはこちらが正しい、と言い張りましょうw

次に文字列行ってみましょう
さて、このあたりから愛が加速していきます。
文字列型の既定値は空白文字なので以下の比較ができます。
とりあえず、上の2行を業務で書く人がいたらブっちょめすwcがはく
#ホントに居たらごめんなさいm(_ _)m

挑戦3、オブジェクトに使ってみよう
VB6のころのNothingは、ちゃんと何もなくしてくれました。
以下も、終了するとちゃんとExcel.exeお家に帰ってタスクマネージャーからいなくなります^^

今のVB.NETは……。単にオブジェクト変数に既定値を放り込むだけなんですね。

せっかく来てくれたのに、Excelくんは遥か彼方の亜空間でずっと待機><
Excel.exeがタスクマネージャに残ったままになります。
可哀そうですが、タスクマネージャから追い返えすなどorz

VB.NETではちゃんとお別れしましょう
お別れは、作った絆をちゃんとすべてReleaseComObjectで解放してお家へ帰らしてあげましょう
【ご参考】COM オブジェクトの参照カウントを解放する
ということで、ホリデーシーズンにピッタリの愛があふれるお話でした^^/