いつの間にか 20万PV。

ここ数ヶ月(数年?)忙しすぎてなにも手を付けずに放置しておりましたが、過去記事をそれなりに参照していただけているようです。
コメント頂いた方、お返事できておらず申し訳ありません。
これからも気の向いたときに、ほのぼのと頑張って行きたいと思います。

DirectorySearcher.PropertiesToLoad の使い方。First Name と Last Name を PowerShell で参照する。

System.DirectoryServices.DirectorySearcherクラスは ActiveDirectory を検索する時にとても便利なのですが、明示的に指定しない限り基本的なプロパティしか取得できません。

たとえば姓(Last Name)と名(First Name)などは PropertiesToLoad プロパティを使って明示的に指定する必要があります。

Microsoftの解説は一応あるのですが、ざっくりしすぎているので使い方を把握するのが大変…。下記は自分用のメモです。

DirectorySearcherの基本的な使い方は他のサイトを参照。

PowerShellで書いた使い方の例。FindAllを行う前にプロパティ名をAddする。

$searcher.PropertiesToLoad.Add("プロパティ名")
$results = $searcher.FindAll()

読み込み: 同じプロパティ名で参照できる。

foreach( $userObject in $results){
Write-host $userObject.properties["プロパティ名"]
}

ハマりやすい注意点:

  • このプロパティ名は小文字であることが必須の模様。
  • 1つでもAddすると、これまでデフォルトで参照できた他の全てのプロパティが出てこなくなる。基本的な name, samaccountname なども追加する必要あり。

下記は姓(SN)、名(GivenName)、W2Kログイン名(SAMAccountName)をリストアップする例。

$propList = "samaccountname","sn","givenname"
foreach ( $p in $propList ){ $searcher.PropertiesToLoad.Add($p) }
$results = $searcher.FindAll()
foreach ($userObject in $results)
{
    Write-Host "ログイン名 $($userObject.properties.samaccountname)"
    Write-Host "姓 $($userObject.properties.sn)"
    Write-Host "名 $($userObject.properties.givenname)"
}

リモートレジストリでOutlook PSTファイルの場所を取得する

Outlookが入ったPCを複数台同時に入れ替えるような場面でPSTファイルの場所をすぐに特定できれば便利です。

PSTファイルのパスはこのレジストリに保管されているのですが、デコードしなければ読むことができません。
(Outlook2003ではMAPI経由で読み出しができない模様)

HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles

こういうニーズに答えてくれるPowerShellがなかなか見つからなかったので自分で作ってみました。

HIVEはユーザーのSIDとなります。ユーザー名からSIDを取得する方法はこのあたりの記事が参考になります。

$computername = "COMPUTERNAME"
$reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('Users', $computername)
$HIVE = "S-1-2-34-5678901234-5678901234-5678901234-56789"

$MAPI_PROFILE_KEY = "Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles"
$MAPI_SERVICES_KEY = "9207f3e0a3b11019908b08002b2a56c2"
$PR_STORE_PROVIDERS = "01023d00"
$PR_PST_PATH = "001f6700"

$regKey= $reg.OpenSubKey("$($HIVE)\$($MAPI_PROFILE_KEY)")
$strDefaultProfile = $regkey.GetValue("DefaultProfile")
$strProfileKey = $MAPI_PROFILE_KEY + "\" + $strDefaultProfile + "\"

$regKey= $reg.OpenSubKey("$($HIVE)\$($strProfileKey)$($MAPI_SERVICES_KEY)")
$arrStoreUIDs = $regkey.GetValue($PR_STORE_PROVIDERS)

$iCount = $arrStoreUIDs.Length/16

$results = @()
$num = 0
for( $i=0 ; $i -lt $iCount ; $i++ ){
	$strServiceKey = ""
	for( $j=0 ; $j -lt 16 ; $j++ ){
		$hex = "0" + "{0:X}" -f $arrStoreUIDs[$i*16+$j]
		if( $hex.length -gt 2 ){
			$hex = $hex.substring( $hex.length - 2  , 2 )
		}
		$strServiceKey += $hex
	}
	$regKey= $reg.OpenSubKey("$($hive)\$($strProfileKey)$($strServiceKey)")
	$pstPath = $regkey.GetValue($PR_PST_PATH)
	if( $pstPath ){
		$pstPath = [System.Text.Encoding]::Unicode.GetString($pstPath)
		if( $pstPath.EndsWith([char]0) ){
			$pstPath = $pstPath.substring( 0, $pstPath.length-1 )
		}
		write-host $pstPath
	}
}

PowerShellでPINGチェック (WMI)

テキストファイルに一行ずつ羅列されたコンピュータ名一覧からPING応答しないものだけ表示するPowerShellスクリプト

Win32_PingStatus を使用するとスマートですね。

$ComputerListFileContent = get-content "ComputerList.txt"

foreach ($Computer in $ComputerListFileContent) {
	$computer=$computer.trim()
	$pingresult = gwmi Win32_PingStatus -filter "Address='$computer'"
	if($pingresult.StatusCode -ne 0){
		Write-Host "NotResponding $($computer)"
	}
}

回復パーティションを削除する方法

管理ツール コンピュータの管理 ディスクの管理 でパーティションを削除しようとしても「回復パーティション」と表示されている場合は消去できない場合があります。

DISKPARTコマンドの

DELETE PARTITION OVERRIDE

を使用すればパーティションを削除できるようです。OVERRIDEオプションをつけるのがミソです。
このオプションなしでは「force protected パラメーターを設定しないと、保護されたパーティションは削除できません」と怒られてしまいます。

Windows 2008R2 への SQL Server 2008のインストールが0x84be0004エラーで失敗する。

0x84be0004 は PerfMonCounterNotCorruptedCheck とのこと。
Checks if the existing performance counter registry hive is consistent.
パフォーマンスカウンタのレジストリハイブが不整合を起こしていないか確認しなさいというわけですが、ここの情報を参考に解決できました。
http://support.microsoft.com/kb/976231/en-us

HEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib
を開き
キー009の内容で011を上書きすることによって解決しました。

1.009を丸ごとREGファイルにエクスポート。
2.REGファイルを編集し3行目の「009」を「011」に書き換えて保存。
3.REGファイルを実行