tech.guitarrapc.cóm

Technical updates

PowerShell を Windows Explorer上で 管理者権限として起動する

PowerShell に限らず、 Windows では UAC 導入以降は 管理者権限 (RunAs) が重要な位置づけであることが明示されてきました。 Linux の世界では、 su や sudo でずいぶん以前から管理されてきたのを考えると、 ようやく感は拭えませんしまだまだ不便なのは否めませんが。 さて、管理者として実行するには、 Explorer からであれば 以前紹介したショートカットキー (Shift + Ctrl + その実行ファイル) でもいいでしょう。 また、現在のディレクトリで管理者としてPowerShell を起動するには ファイルメニュー > PowerShell > 管理者と起動 と手間です。 [office src="https://skydrive.live.com/embed?cid=D0D99BE0D6F89C8B&resid=D0D99BE0D6F89C8B%211650&authkey=AG381QJGG7Kj3gQ" width="319" height="222"] それなら、 右クリック (所謂 Cointext memu) を拡張して、 現在のディレクトリでPowerShell を起動させてみましょう。

レジストリ の編集 を扱うにあたり

Context Menu = Shell = Registry ですね。 ということで、レジストリ編集を扱います。 例によって、レジストリ編集は、お使いのコンピュータの動作が不安定になる可能性があるので、「理解、了承しているヒト」のみが、ご自身の責任の上で行ってください。 私はやり方を紹介できますが、責任はとれませんことをご理解、ご容赦のほどお願いいたします。

対象レジストリキー

以下のキーを起点とします。
HKEY_CLASSES_ROOT\Directory\shell
HKEY_CLASSES_ROOT\Directory\Background\shell
HKEY_CLASSES_ROOT\Drive
[office src="https://skydrive.live.com/embed?cid=D0D99BE0D6F89C8B&resid=D0D99BE0D6F89C8B%211651&authkey=AISH9-AQ4oyCcRk" width="293" height="320"] それぞれに
 runas/command 
キーを作成します。

作成するプロパティ

それぞれの command キー に次の Value を作成します。
(default)
HasLUAShield
(default) には、 Context Menu で表示する名称をいれます。
Open PowerShell as Administartor
powershell 起動コマンドはこれです。 (x64です)
"$PSHOME\powershell.exe -NoExit -NoProfile -Command ""Set-Location '%V'"""

Cmdletにして実行してみる

Context Menu に Elevate された実行ファイルを渡すコマンドです。
#Requires -Version 3.0

function Set-ElevatedContextMenu{

	param(
	[ValidateNotNullorEmpty()]
	[PSCustomObject]
	$AddRegValues = $null
	)

	$RegKeys = @(
		"directory",
		"directory\background",
		"drive"
	)

	foreach ($RegKey in $RegKeys){

		$AddRegValues | %{
			$ContextMenu = $_.ContextMenus
			$command = $_.commands
			$version = $_.versions

			New-Item -Path "Registry::HKEY_CLASSES_ROOT\$RegKey\shell" -Name runas\command -Force `
				| Set-ItemProperty -Name "(default)" -Value $command -PassThru `
				| Set-ItemProperty -Path {$_.PSParentPath} -Name '(default)' -Value $ContextMenu -PassThru `
				| Set-ItemProperty -Name HasLUAShield -Value ''
		}
	}

}
実行はこのようにします。 例えば、 PowerShell 64bit をだすならこうです。
$AddRegValues = [PSCustomObject]@{
	ContextMenus = "Open Windows PowerShellx64 as Administrator"
	commands = "$PSHOME\powershell.exe -NoExit -NoProfile -Command ""Set-Location '%V'"""
	versions = "PowerShellx64"
}

Set-ElevatedPowerShellContextMenu -AddRegValues $AddRegValues
これで、Registryにキーが追加されていることが分かります。 [office src="https://skydrive.live.com/embed?cid=D0D99BE0D6F89C8B&resid=D0D99BE0D6F89C8B%211656&authkey=AOSdj4G5rsFamAs" width="319" height="171"] ディレクトリ/ドライブ/ディレクトリの空欄右クリックでContext Menu にも追加されていますね。 [office src="https://skydrive.live.com/embed?cid=D0D99BE0D6F89C8B&resid=D0D99BE0D6F89C8B%211657&authkey=AMggHENcL19PEK0" width="319" height="253"]

複数設定できないのか

少し試したんですが、出来なくてぐもも。 どうやるんですかね。