C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: 【PowerShell】PS1ファイルを管理者として実行する


(過去ログ 176 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■100943 / inTopicNo.1)  【PowerShell】PS1ファイルを管理者として実行する
  
□投稿者/ B.B (1回)-(2022/12/01(Thu) 19:47:06)

分類:[その他の言語] 

windows10pro、windows11pro
PowerShell

PowerShellでisoファイルをマウントしてドライブレターを変更するスクリプトを作成したいのです。
PS1ファイルのコード内に、管理者権限で実行されていなければ管理者権限でPS1ファイルを実行し直すというコードを記述して、ドライブレターを変更するスクリプトを記述しました

【参考】管理者権限に昇格
https://www.cats-insteadof-pc.net/wpdb/index.php/2021/12/31/runas/

【参考】ドライブ・レターの変更
https://impsbl.hatenablog.jp/entry/MountISOandChangeDriveLetter

【作成したコード】
# 管理者権限で実行されていなければ、スクリプトを管理者権限で実行し直す
If (-not ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] 'Administrator')){
    Start-Process -FilePath PowerShell.exe -ArgumentList "-NoLogo -ExecutionPolicy Bypass -File $($MyInvocation.MyCommand.Path)" -Verb RunAs
    Exit
}

# isoファイルをマウントする
$myISO = "C:\TEMP\hoge.iso"
Mount-DiskImage $myISO

#ドライブ・レターをXに変更する。
$vol = Get-DiskImage $myISO | Get-Volume
$old_drv = $vol.DriveLetter + ':'
$new_drv = 'X:'
Get-WmiObject -Class Win32_Volume | Where-Object {$_.DriveLetter -eq $old_drv} | Set-WmiInstance -Arguments @{DriveLetter=$new_drv}

【不具合の状況】
Windows10ではWindowsのユーザーアカウント制御(UAC)の確認ダイアログが開き「はい」を押すと動作しました。
Windows11ではUACの確認ダイアログが開かずPowerShellの黒いウインドウが開いて閉じて目的のスクリプトは動作しませんでした。

UACの設定はどちらのOSも「アプリがコンピューターに変更を加えようとする場合のみ通知する(規定)」です
Windows11で動作するにはどのようにすればよいかよろしくお願いします


引用返信 編集キー/
■100948 / inTopicNo.2)  Re[1]: 【PowerShell】PS1ファイルを管理者として実行する
□投稿者/ shu (1282回)-(2022/12/04(Sun) 19:54:09)
No100943 (B.B さん) に返信

ps1の実行が許可されていないとかありませんか?
Powershellを単独で開いてps1ファイルの古パスを入力しエンターをしてみてください。

もし該当するなら管理者でPowershell画面を表示し
Set-ExecutionPolicy RemoteSigned
を行ってみてください。

引用返信 編集キー/
■101002 / inTopicNo.3)  Re[2]: 【PowerShell】PS1ファイルを管理者として実行する
□投稿者/ B.B (3回)-(2022/12/08(Thu) 19:26:35)
No100948 (shu さん) に返信
> ■No100943 (B.B さん) に返信

> ps1の実行が許可されていないとかありませんか?
> Powershellを単独で開いてps1ファイルの古パスを入力しエンターをしてみてください。

Windows10,Windows11ともにフルパスで実行したところ「このシステムではスクリプトの実行が無効になっているため、
ファイル C:\hoge.ps1 を読み込むことができません。」 という表示がされました。

> もし該当するなら管理者でPowershell画面を表示し
> Set-ExecutionPolicy RemoteSigned
> を行ってみてください。

Set-ExecutionPolicy RemoteSignedを実行したところ「実行ポリシーの変更 [Y] はい(Y) [A] すべて続行(A) [N] いいえ(N) [L] すべて無視(L) [S] 中断(S) [?] ヘルプ (既定値は "N"):」という選択肢が出ました。

素人に簡単に実行してもらうためのスクリプトなのでポリシーの変更などを相手先にしてもらうのは敷居が高いので他の方法を探したいと思います
引用返信 編集キー/
■101003 / inTopicNo.4)  Re[3]: 【PowerShell】PS1ファイルを管理者として実行する
□投稿者/ B.B (4回)-(2022/12/08(Thu) 20:56:28)
2022/12/08(Thu) 20:58:45 編集(投稿者)

【原因】
スクリプトの実行が許可されていないことが原因のようです、shu さんアドバイスありがとうございました。
なぜWindows10でps1が実行できたのかが謎ですがそれらしい挙動も思い当たります。
Windows10でps1を実行すると「実行ポリシーの変更」のウインドウが開くときがありました。ウインドウを閉じて再度実行すると問題なく動作していましたが何だろうと疑問でした。
OSを再起動後にps1を実行するとまた「実行ポリシーの変更」のウインドウが開きます。それをキャンセルした後にps1が実行できてしまうことがおかしいのであり結局Windows10での挙動の方が不具合なのかなとも思います。

【解決策】
以下のサイトを参考にbatファイルからps1を実行することにしました。
https://qiita.com/alchemist/items/e6706cd425f8f5e5032e
方法2: PowerShellの起動オプションとして実行ポリシーを指定する
powershell -ExecutionPolicy RemoteSigned -File script.ps1

上記サイトを参考に以下のコードをhoge.batに記述して実行するとうWindows11でもhoge.ps1が動作しました
powershell -ExecutionPolicy RemoteSigned -File hoge.ps1

しかし「#ドライブ・レターをXに変更する。」までは動作しましたがその後に本来入れる予定であったexeを実行するコマンドは動作しませんでした、許可されていないようです。
根本的な解決には至りそうにないのでpowershell以外での実装を検討したいと思います。ありがとうございました
解決済み
引用返信 編集キー/
■101024 / inTopicNo.5)  Re[4]: 【PowerShell】PS1ファイルを管理者として実行する
□投稿者/ B.B (6回)-(2022/12/11(Sun) 23:59:18)
2022/12/12(Mon) 00:29:31 編集(投稿者)
2022/12/12(Mon) 00:28:55 編集(投稿者)
No101003 (B.B さん) に返信

引用返信 編集キー/
■101025 / inTopicNo.6)  Re[5]: 【PowerShell】PS1ファイルを管理者として実行する
□投稿者/ B.B (7回)-(2022/12/12(Mon) 00:28:30)
【後日追記】
自己解決したので追記しておきます。
batファイルにPowerShellスクリプトを埋め込むという方法で実現させました。
batファイル一つで済むので自分にはこの方がよかったです
batファイルを右クリックして管理者権限で実行させれば動作します

【参考】コマンドプロンプトからPowerShellのコマンドレットを実行する
https://munibus.hatenablog.com/entry/2022/03/13/235241

【参考】バッチファイルから PowerShell を呼び出して結果を変数に格納する
https://maku.blog/p/372dx46/

【参考】ドライブ・レターの変更
https://impsbl.hatenablog.jp/entry/MountISOandChangeDriveLetter


【hoge.bat コード】
rem isoファイルの絶対パスを作成する
set myISO="C:\TEMP\hoge.iso"

rem ISOファイルをマウントする
Powershell -command "Mount-DiskImage %myISO%"

rem マウントしたISOファイルのボリュームを取得する。
set ps_command=`powershell "(Get-DiskImage %myISO% | Get-Volume).DriveLetter"`
FOR /F "usebackq delims=" %%A IN (%ps_command%) DO set old_drv=%%A

rem WMIでは'X:'のように「:」が必要なので付与する。
set old_drv='%old_drv%:'
set new_drv='X:'

rem まずボリューム情報の一覧をWMIオブジェクトとして取得する。取得したボリューム情報から、ISOファイルが割り当てられているボリュームを特定し、インスタンス化する。インスタンス化したボリュームのドライブ・レターを目的のものへ変更する。この一連の流れをパイプを介して1行で実行している。
@Powershell -command "Get-WmiObject -Class Win32_Volume | Where-Object {$_.DriveLetter -eq %old_drv%} | Set-WmiInstance -Arguments @{DriveLetter=%new_drv%}"

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -