2014年3月11日火曜日

◆PowerShellスクリプトをExeに変換する2

PowerShell: ◆PowerShellスクリプトをExeに変換する

ちょっと使う機会があったのだが、パラメータ指定で躓いたのでメモしておく。

EXEで実行する時はスクリプト実行時と同じ指定ではパラメータが取ってこれない。

調べてみると以下の様に「arguments」指定が必要らしい。

>hoge.exe –arguments –param テストパラメータ

◆WindowsUpdate情報、McAfee情報

McAfeeのDatバージョンとWindowsUpdateの最終更新日を毎月報告せよ、と会社からのありがたーいお達し。

いまどき、「力技でやるんかい」って突っ込みはうちの会社には通用しない。

これまでは某H社の馬鹿高いツールを使っていたのだが、よっぽど評判が悪いのか待てど暮らせどWindows8には対応してこない。

ActiveDirectoryでも入れてちょっとしたツールでも作って情報収集すれば一発なのだが、何があっても(目先の)節約至上主義の会社なので力技をこよなく好む。

とりあえず自分だけは楽をしようとスクリプトを書いてみた。

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

param(
  $mailFrom,
  $mailTo
)
$path = 
"hklm:SOFTWARE\Network Associates\ePolicy Orchestrator\Application Plugins\VIRUSCAN8800"

$prop = Get-ItemProperty -Path $path
#-----
$Session = New-Object -ComObject Microsoft.Update.Session 
$Searcher = $Session.CreateUpdateSearcher() 
$current = $Searcher.QueryHistory(1,1) | select -ExpandProperty date

#-----
$mess1 = "McAfee Datバージョンは 【{0}】 です。" -f $prop.DATVersion
$mess2 = "WindowsUpdate最終適用日は 【{0}】 です。" -f $current

#-----
if($mailFrom -and $mailTo){
  Send-MailMessage    -To $mailTo
                                    `
                     
-From $mailFrom
                                `
                     
-Subject "報告レポート"
                          `
                     
-SmtpServer "hoge.ccc.co.jp"
                  `
                     
-Body "`r`n$mess1`r`n$mess2"
                   `
                     
-Encoding  ([System.Text.Encoding]::
Default)
}

else{
  Add-Type -AssemblyName System.Windows.Forms
  [WIndows.Forms.MessageBox]::Show("$mess1`r`n$mess2") | Out-Null
}

McAfeeのDatバージョンについてはレジストリに持っている値を使ってみました。(確実かどうかは判りません)

WindowsUpdateについては、きっとやり方が色々あるのでしょうが、今回は以下のサイトを参考にしました。
Hey, Scripting Guy! コンピューターに追加されたすべての更新プログラムの一覧を取得する方法はありますか

12行目の「QueryHistory」メソッドで履歴の開始位置と件数を指定する様なので最新の1件を取得してみました。

そのまま実行すると結果をメッセージボックス表示、パラメータを指定するとメール送信としてみました。

------

WindowsUpdateの日付については「Get-HotFix」なんてコマンドレットがあるので、そちらのほうがきっと簡単ですよね・・・。

2014年3月7日金曜日

◆IE画面をアクティブにして最大化

起動中のIEをアクティブにするにはタスクマバーから選択するのが一般的だろう。

通常、ひとつのEXEしか起動していないアプリでは単純にタスクバーをクリックすればよい。

複数のEXEやIEのように複数のタブを開いているアプリケーションはカーソルを持っていくと表示されるサムネイルをクリックすることになる。

一見すばらしい機能なのだが、IEで多くのタブを開いているとサムネイル表示にもたつくこともある。

また、一般的には直近に使っていたタブを使うことが多いと思われる事からサムネイルを省略してとりあえず復帰してよ、っと思うことも多い。

たとえばタスクバーの1番目にIEを表示しているとすると、「Win + 1」で復帰すること自体は可能だ。
しかし、この機能はなぜか必ず先頭のタブを表示してしまう。(><)

単純にもとの状態に復帰するのがなかなか難しい。

「Alt + Tab」や「Win + Tab」なんかは大げさすぎるし、況やフリーソフトのタスクスイッチャーをやである。

どうしてもIEの頻度が最多なので、ダイレクトにIEに戻りたいのだ。

しかたが無いので、PowerShellでちょっと作ってみた。

アクティブにするだけならVBのライブラリーを使ってすぐできるのだが、最大化とかになるといまだにAPIの出番っぽい。

APIについては関数化されている方がいらっしゃるので、そのまま使わせて頂いた。
PowerShellからWin32APIを呼ぶ - 潜在推力
(New-PMethod関数とNew-PType関数)

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

# -----------------------------------------------------------------------
$showWindow          =
 
 
New-PMethod "user32.dll" ([Bool]) "ShowWindow"          @([IntPtr], [Int32])
$setForegroundWindow =
 
 
New-PMethod "user32.dll" ([Bool]) "SetForegroundWindow" @([IntPtr])
# -----------------------------------------------------------------------

$ps = ,(ps iexplore)

$psMain = $ps[0] | ?{$_.MainWindowTitle} 
$showWindow.Invoke($psMain.MainWindowHandle, 3)
$setForegroundWindow.Invoke($psMain.MainWindowHandle)

IEはひとつのWindowで複数のプロセスが動いているのでどれを使えば良いのか良くはわからないのだが、とりあえずMainWindowTitleがあるものを使ってみた。

複数のIEを立ち上げているときはうまい具合に直近に使っていたほうが表示されるようだ。

とりあえず今のところうまく動いているが、非力なマシンでは常駐化とかを考えないと使用に耐えないだろう。(PC起動時もバックグラウンドでごちゃごちゃ動いているので落ち着くまでは遅い)

私はこれにショートカットを割り当て、多機能マウスのボタンに割り当てて使っている。

なんにしても本来PowerShellねたでは無いと思うので具合が良いようであれば別途移植を考えたい。