[PR]

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

runas 以外の verb でも管理者として実行する

うう、すいません、この記事は間違っていましたので修正しましたのです。

runas については「コンテキストメニューに「管理者として実行」を追加する」を参照。

そもそも管理者として実行したいのはどのプロセスなのか。例えば verb が edit でそのコマンドが %SystemRoot%\system32\NOTEPAD.EXE %1 という感じなら、メモ帳を管理者として実行すればいい。つまり notepad.exe を runas で実行するコマンドラインを edit のコマンドに記述すればいい。

あとは Start-Process コマンドレットを使えば任意の verb でプロセスが実行できますので、それでメモ帳とかを runas で実行すると。

それでそのコマンドラインなんですけど、ちょっと PowerShell の実行の方法が微妙にうまくいかなくて、えっと PowerShell のディレクトリには Path が通っているので powershell で呼び出せるだろうと思ったんですけど、レジストリに記述してみると起動してくれないんです。まあいいか。仕方ないのでフルパスで指定しますと下のようになります。

C:\Windows\system32\WindowsPowerShell\v1.0\PowerShell -command "& {start 'exefile' -verb runas -argumentlist 'parameters'}
C:\Windows\system32\WindowsPowerShell\v1.0\PowerShell -command start \"exefile\" -verb runas -argumentlist \"parameters\"

exefile に notepad とかを指定して parameters に %1 とか指定します。

環境変数を使えばもう少し短くなりますけど、値を REG_EXPAND_SZ にするのがめんどくさい[1]。短くなればなんでもいいなら次のような方法もあります。

cmd /s /c "powershell -command "& {start 'exefile' -verb runas -argumentlist 'parameters'}""
cmd /s /c "powershell -command start \"exefile\" -verb runas -argumentlist \"parameters\""

レジストリ以外からは普通に powershell で呼び出せるようなので。まあこういう方法もあるみたいな。

場合によってはもっと簡単になります。例えば open を管理者権限で実行したいというのが、デフォルトの動作(ダブルクリック時とか)のコマンドを管理者権限で実行したいということなら、デフォルトの verb を runas にするほうが楽です。この場合 shell キーの既定に runas って記述するだけで済みます[2]

  1. ^ いいかげん regedit で既定に REG_SZ 以外も扱えるようにしてほしいんですけど。仕様なの?
  2. ^ この方法で、ファイルを開くときのコマンドを任意の verb で実行できます。詳しくは「ファイルをダブルクリックしたときの動作を open 以外の verb にする」を参照。
スポンサーサイト

任意のフォルダから PowerShell を実行する

すいません! 盛大に間違えてましたので修正しました! 恥ずかしい!

「コマンドウィンドウをここで開く」の PowerShell 版です。そんなのコマンドプロンプトのパスを PowerShell にするだけだろっていうのはまあだいたいそのとおりなんですけど。

まず HKCR\Directory\shell\ps\command という感じのレジストリキーを作成します。 Directory は「ファイル フォルダ」のコンテキストメニューなのでお好みで Drive とかも作成してください[1]。あと ps というのはただの文字列で意味はないのでこれも好きに。

このままだとコンテキストメニューの表示は "ps" になるので、 HKCR\Directory\shell\ps キーの「(既定)」に適当な文字を記述しましょう。「PowerShell をここで開く」とか。

あとは下の文字列を HKCR\Directory\shell\ps\command キーの「(既定)」にコピペすれば完了です。ちなみに REG_SZ でいいです。まあ何も考えずにやれば REG_SZ になるんですけど。

C:\Windows\system32\WindowsPowerShell\v1.0\PowerShell -noexit -command pushd "%V"
C:\Windows\system32\WindowsPowerShell\v1.0\PowerShell -noexit -command pushd \"%V\"

コマンドプロンプトだと cmd /s /k pushd "%V" というような感じなので、見事にまんまです。ちなみに PowerShell の pushd は Push-Location コマンドレットのエイリアスなのでコマンドプロンプトのそれとは違うものです。どうでもいいですか。

ところで(というかここからが本題のような)、これを HKCR\Directory\shell\runas\command キーで作成すれば管理者として実行できます。でも runas はコマンドプロンプトに使っていますよね。問題ないならそこに PowerShell のコマンドを書いちゃえばいいんですけど、さすがに完全に PowerShell に移行するには早いと思います。

そこで runas 以外の verb を管理者として実行すればいいわけです[2]。次のように記述すればできます。

C:\Windows\system32\WindowsPowerShell\v1.0\PowerShell -command "& {start powershell -verb runas -argumentlist '-noexit -command pushd `"%V`"'}"
C:\Windows\system32\WindowsPowerShell\v1.0\PowerShell -command start powershell -verb runas -argumentlist \"-noexit -command pushd `\"%V`\"\"

ちなみに、先に触れたようにフォルダのコンテキストメニューのレジストリは他にもあるので、それを利用すれば runas キーを複数作成するのと同じことができそうなのですが、片方しか機能しません。試してみたら Folder キーのほうが優先されるようで、 Directory キーのほうの runas は無かったことにされました。

  1. ^ 「フォルダのコンテキストメニューを追加する4つのレジストリキー」を参照。
  2. ^ 「runas 以外の verb でも管理者として実行する」を参照。
Sponsored Link
Information
Menu
アンケート
Links
Mail Form

名前:
メール:
件名:
本文:

Sponsored Links
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。