2012年7月19日木曜日

◆SharePoint グループ毎に各サイトの権限を表示する

SharePointのサイトで表題のようなニーズがあったのでリンクしておく。

とりあえず、機能要件は満たしているように思う。

2012年7月11日水曜日

◆ファイルをヘキサ(16進文字)で検索

ネットを眺めていて以下のような質問を見つけた。
findstrでバイナリを検索したい - Microsoft Answers

実際PowerShellだとどうなるのかちょっとだけ考えてみた。
(ちょっとだけなので、とりあえずできるかどうかだけ)

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015

param(
 
$FilePath,
  $FindHexString
)

$hexFileString = -join(get-content $filepath -Encoding Byte |
 
           
%{[Convert]::ToString($_,16).padleft(2,"0"
)})
           

for ($i = 0; $i + $FindHexString.Length -le $hexFileString.Length; $i += 2
) {
 
if($hexFileString.SubString($i,$FindHexString.Length) -eq $FindHexString
)
  {
   
return $true
  }
}

return $false

ファイルのパスと検索文字列を受け取って、文字列が含まれているか判定している。

まずは以下で、

Get-Content $filepath -Encoding Byte

こんなファイルの中身を
image

こんな感じに取得している。
image

ヘキサに変換して
image

前ゼロを補って1つの文字列につなげると
image

あとはこれをバイト単位(即ち2文字ずつ)でずらしながら検索文字列で舐めてあげる。

使い方はこんな感じ。
image

細かく試していないのでループの仕方とかは自信がないが、とりあえず雰囲気として検索ができているのではないだろうか。

2012年7月4日水曜日

◆ブートシーケンスを一時的に変更する

Windows8などを試すためにVHDブートをしていると、沢山のOS環境が増えてくる。

別環境に切り替えようと再起動するのだが、他の作業をしていたりして気を抜いているとついブートメニューを見逃してしまう事も多い。

再起動する時点で次にブートアップさせるOSが選択できれば便利である。
以下にその方法が書いてあるのだが若干作業が面倒。
bcdeditコマンドでブート・シーケンスを一時的に変更する - @IT

という事でスクリプト化してみた。

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020

$ids = @()
$titles = @()

bcdedit | %
{
   
if($_ -like "identifier*"
){
       
$words = -split $_
        $ids += $words[1]
    }
   
if($_ -like "description*"
){
       
$words = -split $_
        $titles += $words[1..($words.count-1)] -join " "
    }
}

Write-Host "Choose Boot Number" -ForegroundColor Yellow 
for ($i = 0; $i -lt $ids.Count; $i++
) {
   
Write-Host ($i+1) ":" $titles[$i] $ids[$i]
}
$no = Read-Host "No"
bcdedit /bootsequence $ids[$no - 1]
Restart-Computer

image

再起動後にブートさせたいOSの番号を入力してあげれば良い。

ちなみに、このスクリプトをWindows8環境で動かすには「管理者として実行」のショーをカットを作っておくと便利かもしれない。
MTG Blog: ◆Windows8RPでコマンドを管理者として実行する

2012年7月1日日曜日

◆スリープ時にiPod装着をチェックする

半年ほど前からiPodシャッフルを使っている。
安くてコンパクトで気に入っているのだが、USBに繋いで充電したままPCをスリープさせてしまうと逆に放電されてしまう。

朝気づくと充電がスッカラカンという事をなんどかやらかして、何かしら対策しないといけないと思い立った。(繋いでいるPCのUSBに依存した現象なのかもしれないが・・・)

スリープイベントを拾ってiPodがつながっていたら警告、って事にすれば良さそうだ。

Get-PSDriveでドライブ情報を取ってきてiPodかどうかを判定すれば良い。
幸い、DescriptionにiPodの名前が入っている。

っと思ったのだが、どうにもこうにもこいつが不思議な動作をする。
Descriptionに名前が入っている時と入っていない時があるのだ。
接続の都度違うとかではなくて、Get-PSDriveを呼ぶ都度?(環境)に違ったりする。
結局法則性がつかめなかったのでGet-PSDriveは諦めて「win32_usbhub」を使うことにした。

イベント自体は以前も使っているので以下と同様にしてみた。
PowerShell: ◆スリープ(Sleep)解除イベントを拾う

</
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
028
029
030
031
032

#requires -version 2.0
#
# Sleep時にiPod接続の監視
#

$iPodString = "Apple Mobile Device USB Driver"
$identifier = "EnteringSuspend"
$query =
 
 
"Select * From Win32_PowerManagementEvent where EventType=4"
Register-WmiEvent -query $query -sourceidentifier $identifier 

try
{
 
While($true
){
   
$newEvent = Wait-Event -SourceIdentifier $identifier
    if(gwmi win32_usbhub | ?{$_.name -eq $iPodString
}){
     
$sam = New-Object -comObject SAPI.SpVoice
      $sam.Speak("i Pod is connecting."
 )
    }
       
   
Get-Event -SourceIdentifier $identifier | Remove-Event
     
  }
}

catch
{
   
Write-Warning "以下のエラーが発生しました"
    $error[0]
}
finally
{
   
#イベントを削除し購読をやめる
    Get-Event $identifier | Remove-Event
    Get-EventSubscriber -sourceidentifier $identifier |
 
     
Unregister-Event
}

警告は音声を使ってみたが、ココらへんは好みに応じて変更すれば良いだろう。

基本的にはUSBメモリーの抜き忘れなどにも使えそうなので用途はありそうだ。