【確認】PSRemotingやinvoke-commandで管理者権限が必要なcmdletを試す

localhostで管理者powershellを起動するときはユーザーアカウント制御が作動し、
「このアプリがデバイスに変更を加えることを許可しますか」と聞いてくる。
PSRemotingやinvoke-commandはどうなっているのだろうと気になり試してみた。

【結論】

  • PSRemotingでは管理者として認知してくれる
  • invoke-commandでも管理者として認知してくれる

get-websiteは管理者権限が必要なため、管理者権限を持っていても通常(localhost)のpowershellでは実行できない。

PS >get-website 'default web site'
PS >終了エラー(Get-Website): "名前 'WebAdministration' を持つプロバイダーが見つかりません。"
get-website : 名前 'WebAdministration' を持つプロバイダーが見つかりません。
発生場所 行:1 文字:1
+ get-website 'default web site'
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (WebAdministration:String) [Get-Website], ProviderNotFoundException
    + FullyQualifiedErrorId : ProviderNotFound,Microsoft.IIs.PowerShell.Provider.GetWebsiteCommand
get-website : 名前 'WebAdministration' を持つプロバイダーが見つかりません。
発生場所 行:1 文字:1
+ get-website 'default web site'
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (WebAdministration:String) [Get-Website], ProviderNotFoundException
    + FullyQualifiedErrorId : ProviderNotFound,Microsoft.IIs.PowerShell.Provider.GetWebsiteCommand

勿論、管理者権限のpowershellからは実行できるが、管理者権限のpowershellを起動するにはGUI操作が必要になる。
一方、

PSRemotingでは管理者権限者として認知してくれているようだった。
[PCXXX]: PS C:\Users\user1\Documents> get-website 'default web site'

Name             ID   State      Physical Path                  Bindings
----             --   -----      -------------                  --------
Default Web Site 1    Stopped    %SystemDrive%\inetpub\wwwroot  http *:80:
invoke-commandでも管理者権限者として認知してくれているようだった。
PS >invoke-command -computername PCXXX -scriptblock { get-website 'default web site'}

Name             ID   State      Physical Path                  Bindings                                              PSComputerName
----             --   -----      -------------                  --------                                              --------------
Default Web Site 1    Stopped    %SystemDrive%\inetpub\wwwroot  http *:80:                                            PCXXX

PS >invoke-command -computername PCXXX -scriptblock { start-website 'default web site'}
PS >invoke-command -computername PCXXX -scriptblock { get-website 'default web site'}

Name             ID   State      Physical Path                  Bindings                                              PSComputerName
----             --   -----      -------------                  --------                                              --------------
Default Web Site 1    Started    %SystemDrive%\inetpub\wwwroot  http *:80:                                            PCXXX

PSRemotingではGUI操作はできないので管理者ユーザーが管理者権限で実行できるのは当然なのかもしれない。
localhostでのハードルが高いのは、たぶんユーザーへの安全性への配慮なのだろう。

余談

invoke-commandはlocalhostのscript fileを指定して実行することもできる。

PS >invoke-command localhost -filepath D:\Learning\powershell\qiita.ps1              

qiita.ps1

$url = 'https://qiita.com/api/v2/items?page=1&per_page=20'
$r = curl -URI $url
$c = ($r.content | convertfrom-json )
$i = 0
foreach ( $a in $c ){
    Write-Host "[${i}]"  ${a}.title
    $i ++
}

関数を実行することもできるが、

PS >invoke-command localhost -scriptblock $function:testfunc

2022102211:24:31

関数名に'-'が含まれている場合や

PS >invoke-command localhost -scriptblock $function:test-function -argumentlist"2"
Invoke-Command : パラメーター 'ScriptBlock' をバインドできません。"-function" の値を "System.String" 型から "System.Management.Automation.ScriptBlock" 型に変換できません。
...

引数を必要とする関数の場合のやり方が分からず諦めた。

PS >invoke-command localhost -scriptblock $function:testfunction -argumentlist"2"
Invoke-Command : パラメーター 'ScriptBlock の引数を確認できません。引数が null です。引数に有効な値を指定して、コマンドを再度実行してください。
...