【確認】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 2022年10月22日 11: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 です。引数に有効な値を指定して、コマンドを再度実行してください。 ...
了