注意
自己責任でお願いします。これら記事の内容を実行して何か不都合を被ったとしても筆者は責任を負いません。
性質上セキュリティホールを自分で開けているようなものなので、実装は実験目的かつ仮想環境を推奨します。なお当たり前ですが実装自体には管理者権限が必要です。また自分の所有する端末のみで行ってください。
もし sudo を使いたいなら、Windows 標準 か Grignoli 氏の gsudo を使えばよいと思います。
構成
目次
1. 変数の宣言と代入
2. 接続設定
3. 構成ファイル作成・登録
4. 権限設定
5. 証明書作成
6. 証明書紐付け
7. 実行・関数作成
8. 後始末
説明
今回使う変数を一括で初期化しています。ただし各頁にも冒頭に記載しています。
内容
↓すべて管理者権限で実行します↓
変数の宣言と代入
# 役割の名前
$RoleName = "Mock"
# 接続時に使う名前
$HostName = "127.0.0.1"
# 今回ファイルを保存するモジュールディレクトリ
$ModDirName = "JEA"
# PowerShell が既定で読み込む、全ユーザー用のモジュールディレクトリ
$EntirePath = ($Env:PSModulePath -split ";" -like "$Env:ProgramFiles*")[-1]
# sudo を許可するユーザー
$SelectUser = [Security.Principal.WindowsIdentity]::GetCurrent().Name
# コマンドを実行する際に用いるユーザーのログオンコンテキスト
# $TargetUser = Get-Credential
# レジストリパス
$RegLmPath = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WSMAN"
# Web Services for Management におけるパス
$WsManPath = "WSMan:\localhost"
# Windows Remote Management におけるパス
$WinRmPath = "winrm/config"
# 証明書ストアのパス
$LocateUser = "Cert:\CurrentUser\My"
$LocateMy = "Cert:\LocalMachine\My"
$LocateCA = "Cert:\LocalMachine\CA"
$LocateRoot = "Cert:\LocalMachine\Root"
# 証明書名のワイルドカードパターン
$Pattern = "My * - UserDef"
変数の調整
# 今回作成する構成ファイルの保存先ディレクトリ
$ModulePath = Join-Path $EntirePath $ModDirName
# ディレクトリと同名のモジュールマニフェスト
$ManifestPd = Join-Path $ModulePath "${ModDirName}.psd1"
# セッション構成ファイル
$SessionCfg = Join-Path $ModulePath "${RoleName}Session.pssc"
# 役割構成ファイルを保存するディレクトリ(既定: RoleCapabilities)
$RoleInPath = Join-Path $ModulePath RoleCapabilities
# 役割構成ファイル
$RoleConfig = Join-Path $RoleInPath "${RoleName}.psrc"
# フレーズ(GUID)ファイル
$PhrasePath = Join-Path $RoleInPath "phrase.uid"
# セッション構成(エンドポイント)登録名
$Enrollment = $RoleName + "Endpoint"
# 指定したユーザーからユーザーオブジェクトを作成
$UserObject = [Security.Principal.NTAccount]::new($SelectUser)
# セキュリティ識別子に変換
$UserSid = $UserObject.Translate([Security.Principal.SecurityIdentifier]).Value
# コンピューター名・ドメイン名を削除した純粋なユーザー名を取得
$UserName = $UserObject.Value.Split("\")[-1]
# ローカルアカウントを UPN で表記
$LocalUPN = "$UserName@localhost"
# ログオン名(PC\UserName)を取得
$LogonName = (Get-CimInstance Win32_UserAccount).Where{$_.Name -eq $UserName}[0].Caption
# WinRM 認証に使うアカウントの名前とパスワード
$Credential = Get-Credential $LogonName
$TargetUser = if($null -eq $TargetUser){$Credential}else{$TargetUser}
$Password = $Credential.GetNetworkCredential().Password
# セキュリティ記述子定義の保存用
$SddlBkName = "${Enrollment}." + (Get-Date -Format "yyyy-MM-dd_HH-mm-ss") + ".sddl"
$BackupSddl = Join-Path $Env:UserProfile $SddlBkName
確認
"$RoleName","$HostName","$ModDirName","$EntirePath","$SelectUser",
"$RegLmPath","$WsManPath","$WinRmPath",
"$LocateUser","$LocateMy","$LocateCA","$LocateRoot",
"$Pattern"
"$ModulePath","$ManifestPd","$SessionCfg","$RoleInPath","$RoleConfig","$PhrasePath",
"$Enrollment",
"$UserObject","$UserSid","$UserName","$LocalUPN","$LogonName",
"$Credential",
"$SddlBkName","$BackupSddl"
備考
Windows Sandbox で実行する場合
ただし、Windows Sandbox 内の操作は常に管理者権限になっています。
資格情報更新
# Windows Sandbox 内で操作しているアカウントはパスワードが不明なため、自分で設定して明確にする
$Password = "#"
Set-LocalUser $UserName -Password (ConvertTo-SecureString $Password -AsPlainText -Force)