ps1 스크립트를 일반 사용자로 시작할 때 관리자 권한으로 다시 시작하는 스크립트

11415 단어 PowerShell

개요



Powershell 있는데, "관리자로 실행"하는 것이 번거롭기 때문에 스크립트 측에서 마음대로 관리자 시작 버리게했습니다.
(확인 다이얼로그가 나옵니다)

본문



1. 코드



main.ps1
# 管理者権限でない場合、現在のスクリプトを管理者権限で実行して自分は終了
if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator))
{
    $commandPath = $PSCommandPath
    echo ("not admin. restart as admin:" + $commandPath)

    # 引数を、管理者権限実行用に作り直す
    # 引数が、クォートされた空白を含む文字列である場合を想定。
    # そこまで考えないでいいなら、Start-Process の $argsToAdminProcess の代わりに$Argsを入れても問題ない。
    $argsToAdminProcess = ""
    $Args.ForEach{
        echo ("not admin: args: " + $PSItem)
        $argsToAdminProcess += " `"$PSItem`""
    }

    # 実行
    Start-Process powershell.exe "-File `"$commandPath`" $argsToAdminProcess"  -Verb RunAs
    # デバッグ用に、閉じる前に止める。
    Pause
    exit
}

echo "admin."

# 管理権限実行に渡ってきた引数を確認する
$Args.ForEach{
    echo ("admin: args: " + $PSItem)
}

# デバッグ用に、閉じる前に止める。
Pause

2. 명령 및 실행 결과



명령 및 실행 결과
PS C:\dev\src\tmp> .\main.ps1 aaa "bbb ccc" ddd
not admin. restart as admin:C:\dev\src\tmp\main.ps1
not admin: args: aaa
not admin: args: bbb ccc
not admin: args: ddd
続行するには、Enter キーを押してください...: 

관리 권한으로 시작된 측의 실행 결과
admin.
admin: args: aaa
admin: args: bbb ccc
admin: args: ddd
続行するには、Enter キーを押してください...:
$Args.ForEach{... 로 인수를 재조립하지 않은 경우, 인수는 aaa bbb ccc ddd

3. 빠진 곳


    # 実行
    Start-Process powershell.exe "-File `"$commandPath`" $argsToAdminProcess"  -Verb RunAs
Start-Processの引数powershell.exeの引数 가 섞여 있다고 알아차릴 때까지는 의미를 몰랐습니다.Start-Processの引数powersshell.exe-Verb RunAs ,powershell.exeの引数"-File `"$commandPath`" $argsToAdminProcess" 입니다.
그리고 여기가 안된다면, Start-Process로 기동한 윈도우가 즉시 소멸하기 때문에, 무엇이 나쁜지 단서가 잡히지 않고 괴로웠다. . .
감사합니다. [Security.Principal.WindowsPrincipal]

4. 짧게 한 버전



디버깅 용 echo 또는 깎은 버전입니다.
코멘트 넣어 8행이므로, 관리 권한이 필요한 스크립트의 머리에 일률 카피해도, 그런 방해도 아닐까 생각합니다.

짧은 버전
# 管理者権限でない場合、現在のスクリプトを管理者権限で実行して自分は終了
if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator))
{
    $argsToAdminProcess = ""
    $Args.ForEach{ $argsToAdminProcess += " `"$PSItem`"" }
    Start-Process powershell.exe "-File `"$PSCommandPath`" $argsToAdminProcess"  -Verb RunAs
    exit
}

echo "admin."

# 管理権限実行に渡ってきた引数を確認する
$Args.ForEach{
    echo ("admin: args: " + $PSItem)
}

참고로 한 페이지



Powershell 스크립트를 관리자 권한으로 다시 실행하는 방법
꽤 범용적으로 작성되었습니다.

【PowerShell】 PowerShell을 관리자 권한으로 실행하고 싶다! 소스의 선두에 묻는 것만으로 자동으로 관리자 권한으로 승격하는 스크립트! - 이거 토로구
한 라이너로 작성되었습니다. 인수는 고려되어 있지 않습니다만, 인수 캐릭터 라인내의 공백 고려 없이 좋으면, $Args 를 들어가야 합니다.

나중에 떨어지는



인수를 반영하려고 노력했지만 인수를 사용하는 시점에서 높은 확률로 powershell을 기동하고 있기 때문에 인수 대응의 필요성은 낮다고 생각했습니다.
ouch ...

좋은 웹페이지 즐겨찾기