tech.guitarrapc.cóm

Technical updates

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

PowerShellに限らず、 WindowsではUAC導入以降は管理者権限 (RunAs) が重要な位置づけであることが明示されてきました。 Linuxの世界では、 suやsudoでずいぶん以前から管理されてきたのを考えると、 ようやく感は拭えませんしまだまだ不便なのは否めませんが。

さて、管理者として実行するには、 Explorerからであれば以前紹介したショートカットキー(Shift + Ctrl + その実行ファイル) でもいいでしょう。 また、現在のディレクトリで管理者としてPowerShellを起動するにはファイルメニュー > PowerShell > 管理者と起動と手間です。

それなら、 右クリック (所謂Cointext memu) を拡張して、 現在のディレクトリでPowerShellを起動させてみましょう。

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

Context Menu = Shell = Registryですね。 ということで、レジストリ編集を扱います。

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

対象レジストリキー

以下のキーを起点とします。

HKEY_CLASSES_ROOT\Directory\shell
HKEY_CLASSES_ROOT\Directory\Background\shell
HKEY_CLASSES_ROOT\Drive

それぞれにrunas/commandキーを作成します。

作成するプロパティ

それぞれのcommandキー に次のValueを作成します。

(default)
HasLUAShield

(default)には、 Context Menuで表示する名称をいれます。

Open PowerShell as Administartor

PowerShellの起動コマンドはこれです。

"$PSHOME\powershell.exe -NoExit -NoProfile -Command ""Set-Location '%V'"""

コマンドレットにして実行してみる

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にキーが追加されていることが分かります。

ディレクトリ/ドライブ/ディレクトリの空欄右クリックでContext Menuにも追加されていますね。

複数設定できないのか

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