2014年6月30日月曜日

◆Profileのスクリプト実行をバイパスする

Profileに記述したスクリプトを実行したくないときが稀にある。

そんなときは、起動パラメータを指定すると良い。

>PowerShell –NoProfile

頻繁に使う場合は、スクリプトの先頭に以下を追加しておく。

>Add-Type -AssemblyName PresentationFramework
>if([System.Windows.Input.Keyboard]::IsKeyDown('Ctrl')) { return }

Profile以外でも使えそうな機能なので覚えておくと良さそう。

ただし、この機能はSTAを要求するようなのでPowerShell3.0以降で使うのが良いかも。

2014年5月19日月曜日

◆メーラーを使ってメール送信

ウィルス対策ソフトによって「Send-MailMessage」がブロックされる場合、仕方が無いのでメールソフト経由で送信する。

もしかするとOUTLOOKあたりならCOMでも用意されているかも知れないが、今回はSendKeyを使った力技で。

こんなものでも使える局面はあるかもしれない。

001
002
003
004
005
006
007
008
009
010

add-type -AssemblyName System.Windows.Forms
$subject = 'メール送信のテストです'
$body = '本文です'
$to = 'minminnana@hoge.co.jp'
$mail = "mailto:$to&subject=$subject&body=$body"
Start-Process -FilePath $mail 
Start-Sleep -Seconds 2

#outlookの送信キー
[System.Windows.Forms.SendKeys]::SendWait("%S")

2014年5月2日金曜日

◆EFSでファイル暗号化

日々のPC利用において頭の痛いことの一つにパスワードの管理がある。
クラウドの普及に伴って、管理すべきパスワードの数は増加の一途。
大体は共通のパスワードを使いまわしたりするのだが、怪しげなサイトにも使ったりすると非常に危険。

私も以前、GmailのIDをのっとられた事があるので、それからは個別のパスワードを使用している。

ただし、当然いくつものパスワードを記憶できるわけも無く・・・。
結局メモする事になる。

素のまま置いておくのはさすがに気がひけるので暗号化を試してみる。

会社内とかの使用に限定するのであれば、OSの機能で暗号化するのが簡単だ。

暗号化したいファイルのプロパティから指定するだけ。
image

暗号化すると以下のように緑色で表示される。
image

ファイルサーバーに置いたファイルも、ドメイン内ならば暗号化したときと同じユーザーでログインすればどのクライアントからも使用できる。

PowerShellからも以下のように簡単に暗号化できる。

PS>(Get-Item  d:\Desktop\test.txt).Encrypt()

2014年4月30日水曜日

◆UNCパスをTest-Pathで確認する

Testing UNC Paths - Power Tips - PowerShell.com – PowerShell Scripts, Tips, Forums, and Resources

Set-Location HKCU:\

とかやった後に、Test-Path \\Server\myfolder

とかでUNCパスを確認しようとするとうまくいかないってお話。

\\Server というレジストリーを探しに行っちゃうって事でしょうか。

コンテキストの影響を受けずに確認するには、

Test-Path  FileSystem::\\Server\myfolder

とやると良いとの事。

2014年4月22日火曜日

◆レジストリへのアクセス

レジストリへのアクセスは専用のプロバイダーが用意されていて、通常のファイルシステムのようにアクセスできる。
 特に難しいわけではないのでこれまでも適当に使ってきたが、それほど頻繁に使うわけでもないので、結局毎回試行錯誤しながら使うことになる。

そこで、いまさらの感はあるが使い方を自分用にメモしておく。

基本的には「Get-Item」と「Get-ItemProperty」を使ってアクセスする。(と思う)

以下のレジストリにアクセスしてみる。

image

Get-Item」で「TortoiseSVN」キーにアクセスするとこんな感じになる。

PS>Get-Item hkcu:software\TortoiseSVN


    Hive: HKEY_CURRENT_USER\software


SKC  VC Name                           Property
---  -- ----                           --------
  7  12 TortoiseSVN                    {SoundUtils KeyPath, TortoiseSVN,

「SKC」というのは「SubKeyCount」の略で、以下の部分の個数を表す。
image

「VC」は「ValueCount」の略で、以下の部分の個数を表す。
image

「プロパティ」は以下を指すようだ。
image

 

「Get-Item」を「Get-ChildItem」に変えると以下のようにサブキー毎に同様の情報が表示される。

PS>Get-ChildItem hkcu:software\TortoiseSVN


    Hive: HKEY_CURRENT_USER\software\TortoiseSVN


SKC  VC Name                           Property
---  -- ----                           --------
  0  17 DiffTools                      {.dll, .exe, .doc, .docm...}
  1   1 History                        {lastCheckoutPath}
  0   4 LastUsedUUIDsForGrouping       {0, 1, 2, 3}
  0   1 LogCache                       {Version}
  0   6 MergeTools                     {.doc, .docm, .docx, .ods...}
  0   6 StatusColumns                  {CommitDlgVersion, CommitDlg,
  1   0 TortoiseProc                   {}

プロパティの一覧は以下のように取得

PS>(Get-item hkcu:software\TortoiseSVN).property
SoundUtils KeyPath
TortoiseSVN
TortoiseMerge
TortoiseIDiff
DiffProps
CurrentVersion
CheckNewerWeek
RepoBrowserColumnWidth
ErrorOccurred
NewVersionLink
NewVersionText
NewVersion

これでも同じっぽい

PS>(Get-item hkcu:software\TortoiseSVN).getvaluenames()

ただし、どちらも取得できるのは文字列の情報。

以下の一行の情報をオブジェクトで取得できるのかと思ったのだが、どうにも見当たらない。
image

とりあえずダイレクトにバリューを取得するには、

PS>(Get-item hkcu:software\TortoiseSVN).GetValue("CheckNewerWeek")
16

ここで、「Get-ItemProperty」を試してみると、こちらは以下のオブジェクトを返してくる。(1つのオブジェクト)
「Get-Item」と違ってサブキーの情報は取得できない。
名前の通り、自身のプロパティに特化した情報といった感じ。
image

左側の「名前」(プロパティ)をその名の通りプロパティとして持っているオブジェクトなので、ダイレクトにバリューを取得するには、

PS>(Get-ItemProperty hkcu:software\TortoiseSVN).CheckNewerWeek
16

となる。

これを踏まえて「Get-Item」を使って一覧表示するには、プロパティ(ValueName)を纏めて取得し、その一つずつに対して「GetValue()」でバリュー、「GetValueKind()」で種類を取得する。
image

image

種類が不要であれば「Get-ItemProperty」だけで事足りる。(が、こちらは余計なプロパティも含まれる)

PS>Get-ItemProperty hkcu:software\TortoiseSVN


PSPath                 : Microsoft.PowerShell.Core\Reg
PSParentPath           : Microsoft.PowerShell.Core\Reg
PSChildName            : TortoiseSVN
PSDrive                : HKCU
PSProvider             : Microsoft.PowerShell.Core\Reg
SoundUtils KeyPath     : keypath
TortoiseSVN            : TortoiseSVN
TortoiseMerge          : TortoiseMerge
TortoiseIDiff          : TortoiseIDiff
DiffProps              :
CurrentVersion         : 1.8.4.24972
CheckNewerWeek         : 16
RepoBrowserColumnWidth : 00000000000000000000000000000
ErrorOccurred          : 0
NewVersionLink         :
http://tortoisesvn.net
NewVersionText         : A new version of TortoiseSVN
NewVersion             : 1.8.6.25419

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」なんてコマンドレットがあるので、そちらのほうがきっと簡単ですよね・・・。