2013年10月25日金曜日

◆C#からPowerShellを使う

昔どこかで見かけたことはあるが、あまり使い道は無いのかと思っていた。

ふと思い立って、一応使い方を確認しておくことにした。

まずは、DLL(System.Management.Automation.dll)が必要なようなので参照を追加する。私のWindows8環境では以下の場所にあった。

"C:\Program Files\Reference Assemblies\Microsoft\WindowsPowerShell\3.0\System.Management.Automation.dll"

Get-Processを使うにはこんな感じでOKだった。

namespace PowerShellTest

{

    class Program

    {

        static void Main(string[] args)

        {

            PowerShell ps = PowerShell.Create();

            ps.AddCommand("Get-Process");

            var results = ps.Invoke();

            results.ToList().ForEach(

                p => Console.WriteLine(p.Properties["ProcessName"].Value));

           

        }

    }

}

image

Get-ProcessからPSObjectが返ってきてしまうので、プロパティが文字列参照になってしまうあたりが今1つな感じ・・・。

2013年10月23日水曜日

PowerShell ISE 新しいタブと新しいページの違い

いままで全く気付いていなかったのだが、ISEでは複数の「タブ」を扱える。

ここで、「タブ」というのは以下

image

をクリックして追加される以下では無い。

image

「ファイル」メニューの以下を選択すると
image

以下のように追加される。

image

今まで「タブ」だと思っていたのは「ページ」とでも呼ぶのだろうか・・・。

どうやらこの「タブ」が1つのセッションとして扱われているらしい。

なので、「タブ」間では変数等が共有されない。

 

これまで、最終確認とかでISE自体を開きなおしていたのだが、実は新しいタブを追加すればよいだけだったのね・・・。(お恥ずかしい)

「Ctrl + N」 新しいページを開く
「Ctrl + T」 新しいタブを開く

2013年10月2日水曜日

◆about系のヘルプはまだ?

最近ちょっとPowerShellから離れていたので良く判らないが、about系のヘルプはまだ日本語化されていないのだろうか。

Update-Helpでも入ってこないっポイ?

Onlineでも参照できない?

image

自分的には英語でもそんなに苦ではないのだが、人に教えるときに「ほら、こうやってヘルプを見ると簡単でしょ?」と言えないのがちょっと・・・。
特にコマンドレットのヘルプなら英語でも良いけど、about系は説明がメインだから余計厳しい。

クライアントではそれほど3.0のメリットも感じないので、7で2.0を使うのが幸せなのだろうか。

8はちょっと失敗感ただよっているしなぁ・・・。

◆昇格した管理者権限で実行されているか確認する

スクリプトが「昇格した管理者権限」を要求するような場合、最初にチェックしたほうが親切かもしれない。

以下にそのサンプルがあったのでメモしておく。
Testing Administrator Privileges - Power Tips - PowerShell.com – PowerShell Scripts, Tips, Forums, and Resources

image

非常に短いコーディングでチェックできるので便利そう。

若干トリッキーなので仕掛けを解析しておくと、
まずネイティブなコマンドの「whoami /groups」を使って現在のユーザーが所属するグループを表示すると以下のような感じで返ってくる。
image

ここで、「昇格した管理者権限」に属する場合は以下のグループが存在するようだ。

image

これは、対話ログオンすると「INTERACTIVE」グループに動的に所属するのと同じパターンかな。

あとは「match」演算子を使って「昇格した管理者権限」の「SID」が含まれるか判定している。

配列に「match」演算子を使うとマッチした要素だけが抽出される。

PS>"ma","mb","mc" -match "b"
mb

あとはマッチしなければ何も返ってこない(null)しマッチすればマッチした文字列が返ってくるのを、「bool」にキャストしている。