2011年7月29日金曜日

◆Write-HostとWrite-Output

PowerShell: ◆ActiveDirectoryグループごとのメンバー一覧を表示するで作った以下のようなスクリプト。
image

結果をちょっとテキストに落としておきましょうと、7行目にリダイレクトを追加した。

} > D:\Desktop\PCList.txt

てな感じ。

すると、結果はだいぶ悲しい事になる。
グループタイトルとメンバー一覧が画面とテキストに泣き別れ。

ん~、そうだよね。Write-Hostだもんね。
という事でこれまであまり気にせずに使っていたWrite-Hostだが、なるべくWrite-Outputを使うべきなのだろうと反省。

ちなみに、6行目はWrite-Hostだと空行を表示してくれるがWrite-Outputだと引数が必須なので、
Write-Output “”
としておく。

2011年7月28日木曜日

◆ActiveDirectory、名前で検索してユーザーアカウントを無効にする

こんな感じで良いみたい。

Get-ADUser -Filter 'name -eq "原 辰則"' | Set-ADUser -Enabled $false

あとは以下のあたりをインプットにして定期的に整理してあげればよいかな・・・。

PowerShell: ◆ActiveDirectory過去2年間ログオンしていないユーザーを検索

2011年7月27日水曜日

◆Webページをダウンロードする2

以前、Webページをファイルにダウンロードしてみたが、ダウンロードした内容を整形してファイルに落としたかったので、一旦文字列に取得してみた。

DownloadFileの代りにDownloadStringを使うだけ。
と思っていたのだが、結果を見てみると日本語が文字化けしている。
Webページのソースを見るとUTF8のようなのでUnicode(UTF16)に変換してあげれば良いのだろうと思い、一生懸命取得した文字列に対してコードを変換を試みたが、なんともかんともうまくいかない。

変換の仕方がおかしいのか・・・。
何か勘違いをしているような・・・。

あちこち彷徨い、やっとWebClientにはEncodingプロパティがあり、こいつにUTF8を指定してやると上手くいくことが判った。
(DownloadStringの引数にも用意してくれれば良いのに・・・)

このプロパティのデフォルトは「Default」なので基本的にはS-JIS。
なので、UTF8をS-JISとして読み込んだ文字列をUTF8だと思って変換しようとしていたので上手くいかなかったのだろう。

001
002
003
004
005

$source = "http://www.yahoo.co.jp/"
$wc = New-Object System.Net.WebClient 
$wc.Encoding = [System.Text.Encoding]::UTF8
$txt = $wc.DownloadString($source)
$txt

◆ActiveDirectory、コンピュータ一覧を取得する

Get-ADComputerコマンドレットでActiveDirectoryのコンピュータ一覧を取得してみた。

デスクトップにCSVで出力するサンプル。

001
002
003
004
005
006
007
008
009
010

$oPath = [environment]::GetFolderPath("desktop")
$outFile = Join-Path $oPath "コンピュータ一覧.csv"

Get-ADComputer -Filter *  -Properties description,lastlogon |
 
 
select name,description,
 @{
   name
="lastLogon"
expression={[DateTime]::FromFileTime([Int64]::Parse($_.
lastLogon))}
  } 
|
 
 
sort lastLogon | ConvertTo-Csv -NoTypeInformation |
 
 
Out-File $outFile -Encoding default

未使用のPCを調べたかったのでlastlogonプロパティを取得してみたが、lastlogon日付はFileTime型のようで変換が必要。

1601 年 1 月 1 日以降の 100 ナノ秒間隔の数を表します。この構造体は 64 ビット値です。

との事なので、[DateTime]::FromFileTime([Int64]::Parse($_.lastLogon))を使って変換してあげると良いみたいです。

2011年7月22日金曜日

◆ActiveDirectory、Search-ADAccountで追加のプロパティを取得する

Search-ADAccountで取得されるのは名前のとおりADAccountオブジェクト。
なので、必要なユーザー情報が全部揃っているとは限らない。

足りないときはどうするか?
とりあえずGet-ADUserで取ってきてみた。

過去2年間ログオンしていないユーザーの名前とメールアドレスを表示するサンプル。

001
002
003
004
005

[string]$span = (365 * 2)  #過去2年間
$target = "OU=OU-Root,DC=xx,DC=xxx,DC=co,DC=jp"

Search-ADAccount -AccountInactive -TimeSpan $span -UsersOnly `
-SearchBase $target | Get-ADUser -Properties mail | select name,mail

◆ActiveDirectory過去2年間ログオンしていないユーザーを検索

001
002
003
004
005

[string]$span = (365 * 2)  #過去2年間
$target = "OU=OU-Root,DC=xx,DC=xxx,DC=co,DC=jp"

Search-ADAccount -AccountInactive -TimeSpan $span -UsersOnly `
-SearchBase $target | select name,enabled,DistinguishedName,LastLogonDate

◆ActiveDirectoryグループごとのメンバー一覧を表示する2

前回、信頼関係を結んだ先のユーザーが上手く表示できなかったのでこれを対策すべく調べてみた。

さしあたって、PowerGUIをだしているQUESTがActiveDirectoryモジュールの拡張版みたいなやつをだしていて、それを使うと解決できそうだ。

普通であればサードパーティモジュールは使いたくない所だが、今回は所詮限られたサーバーに対して限られたクライアントから使うスクリプトなので良しとした。
(どのみちサーバーに追加サービスを入れているし、クライアントにもAD用の管理モジュールを追加しているし。)

モジュールは以下からダウンロード出来る。

気付きづらいが、真ん中辺りにあるチェックボックスをクリックするとダウンロードの一覧が表示される。

インストールしたら、以下のスナップインを追加してあげると、XXX-QADXXXXコマンドレットが使えるようになる。
Add-PSSnapin quest.activeroles.admanagement

後は単純に対応するコマンドレットに置き換えれば良いのかと思ったが、若干パラメータの指定も違うようだ。
詳しくは調べていないのだがとりあえず以下の様にして目的は達成できた。

001
002
003
004
005
006
007
008

#Add-PSSnapin quest.activeroles.admanagement
$target = "OU=OU-Root,DC=xx,DC=xxx,DC=co,DC=jp"
Get-QADGroup -SearchRoot $target -IncludedProperties description | sort name | 
%{
Write-Host ("■■ {0}({1}) ■■" -f $_.name,$_.
description)
    
Get-QADGroupMember -Identity $_ | %{$_.name}
Write-Host
}