none
管理者権限でPowerShellを実行 RRS feed

  • 質問

  • hostsファイルの内容を一般ユーザーが切り替えるスクリプトを作成しようとしています。

    hostsファイルの書き換えには管理者権限が必要のため、通常の方法では書き換えられません。

    最後の行の先頭に#を付ける、付けないと言う処理をしてhostsファイルを一般ユーザーの権限で更新したいのですが、

    どのように行えばよろしいのでしょうか。

    2014年5月26日 2:39

回答

  • > Set-Contentに対して-Credentialのオプションが対応していないと言うことなのでしょうか?

    はい、そういうことです。

    なのでローカルファイルの書き換えに、ログオンユーザー以外のユーザー権限が必要である場合は、Invoke-Commandコマンドレット等で別セッションに資格情報を付与して、そのセッション内でSet-Content等を実行する必要があります。

    しかし、UAC有効時には、HOSTSファイルの書き換えには管理者の資格情報に加え、昇格の操作が必要となるため、上記の方法は使えません。

    PowerShell.exeを管理者の資格情報を用いて昇格して起動し、スクリプトを実行する方法は、「前回のケース」と同様かと思います。

    PowerShell単体で完結させたい場合は、以下の方法が参考になるのではないでしょうか。

    PowerShell: ◆別の資格情報で管理者として実行する2

    • 回答としてマーク UltraKatan 2014年5月27日 23:51
    2014年5月27日 16:23
    モデレータ

すべての返信

  • ご自身で質問しておいて回答を見ていないのでしょうか? であれば質問するべきではありません。

    別の問題として、hostsファイルの書き換えはウィルスの常套手段であり、ウィルス対策ソフトはhostsファイルの書き換えをブロックすることが多々あります。別のアプローチをお勧めします。

    2014年5月26日 4:43
  • 前回のケースはダブルクリック等の簡単な動作にて実行できるかの質問となります。

    前回はVBSとPsExecと言う外部ツールを利用することで解決しております。

    今回はPowerShellのみでhostsファイルを書き換えると言うことを意図した質問のため全く異なった質問となります。

    PowerShellはhostsファイルの書き換えをブロックするのでしょうか?

    また、別のアプローチとはどのような手段があるのでしょうか?

    2014年5月26日 6:29
  • 前回と今回で違いがわかりません。権限を得るために子プロセスを立ち上げる必要があり、呼び出す親プロセスがVBSかPowerShellかの違いでしかないと思いますが。しかし、子プロセスを立ち上げると決定した段階で親プロセスでするべき処理はなくなり、別段VBSで解決したのであれば、今さら無理にPowerShellで呼び出す必要はないと思いますが。

    後半について私は「ウィルス対策ソフトはhostsファイルの書き換えをブロックすることが多々あります」と書きました。PowerShellがスクリプトをブロックするわけではありません。つまり、PowerShell以外であってもhostsファイルに対する書き換え(書き込み)がブロックされます。hostsファイルを書き換えない方法をお勧めします。
    別アプローチについて何か提示するためにはhostsファイルを書き換えることによってどのような結果を得たかったのか、その目的が提示されなければ何も答えようがありません。

    2014年5月26日 10:16
  • $password = ConvertTo-SecureString "Pass" -asplaintext -force
    $cred = New-Object System.Management.Automation.PsCredential "Acount",$password
    $File = $(Get-Content "C:\Windows\System32\Drivers\etc\hosts")
    $Hantei = Select-String -path C:\Windows\System32\Drivers\etc\hosts -pattern "#IPADDRESS"
    if ($Hantei -eq $null)
    {
        $File = $File -replace "IPADDRESS","#IPADDRESS"
        "本番環境を閲覧します。"
    }
    else
    {
        $File = $File -replace "#IPADDRESS","IPADDRESS"
        "テスト環境を閲覧します。"
    }
    $File | Set-Content C:\Windows\System32\Drivers\etc\hosts -Credential $cred

    とすると、「FileSystem プロバイダーが資格情報をサポートしているのは、New-PSDrive コマンドレットでのみです。」

    と言うエラーが発生してしまいます。

    Set-Contentに対して-Credentialのオプションが対応していないと言うことなのでしょうか?

    2014年5月27日 0:06
  • > Set-Contentに対して-Credentialのオプションが対応していないと言うことなのでしょうか?

    はい、そういうことです。

    なのでローカルファイルの書き換えに、ログオンユーザー以外のユーザー権限が必要である場合は、Invoke-Commandコマンドレット等で別セッションに資格情報を付与して、そのセッション内でSet-Content等を実行する必要があります。

    しかし、UAC有効時には、HOSTSファイルの書き換えには管理者の資格情報に加え、昇格の操作が必要となるため、上記の方法は使えません。

    PowerShell.exeを管理者の資格情報を用いて昇格して起動し、スクリプトを実行する方法は、「前回のケース」と同様かと思います。

    PowerShell単体で完結させたい場合は、以下の方法が参考になるのではないでしょうか。

    PowerShell: ◆別の資格情報で管理者として実行する2

    • 回答としてマーク UltraKatan 2014年5月27日 23:51
    2014年5月27日 16:23
    モデレータ
  • 牟田口様

    いつも的確な回答ありがとうございます。

    取り急ぎ、お礼まで。

    2014年5月27日 23:54