web-dev-qa-db-ja.com

UACとWindowsサービス

ユーザーには、UACが有効になっているWindows Server 2012で管理アクセスを必要とするいくつかのことを行うPowerShellスクリプトがあります。

ローカル管理者としてスクリプトを実行すると、アクセスが拒否されて失敗します。しかし、ユーザーが権限を昇格し、スクリプトを管理者として実行する場合は、機能します。ここまでは順調ですね。

これで、PowerShellスクリプトを実行するカスタムのWindowsサービスができました。 Windowsサービスは、同じローカル管理者アカウントで実行するように構成されています(つまり、ローカルシステム/ネットワークサービスなどではありません)。アカウントが管理者でないかのように、スクリプトはアクセスを拒否して失敗します。古いバージョンのWindowsでは、スクリプトは正常に機能します。

Windowsサービスの世界でUACはどのように適用されますか?カスタムローカル管理者アカウントで実行されるWindowsサービスは常に「昇格」されると想定していましたが、この場合はそうではないようです。

10
Paul Stovell

ローカル管理者としてスクリプトを実行すると、アクセスが拒否されて失敗します。

これは、「ローカル管理者」であるだけではスクリプトを実行するのに十分ではないことを意味します。これは、「ローカル管理者」がマシンのすべての権限をカバーしていないことを証明しています。 [〜#〜] uac [〜#〜] のコンテキストでは、「ローカル管理者」は「OS」から見た「管理者」の完全な権限を持っていませんが、管理権限を必要とする何かを行うように要求し、UACが呼び出しをインターセプトし、エラーコードで要求を誤って拒否する代わりに、ユーザーにプロンプ​​トを出します 。ユーザーが「はい、続行します」と言った場合、プロセスには昇格された権限が付与されます。プロセスの観点から見ると、すべてが「真の管理者」であるかのように機能します。

サービスはセッションでは実行されず、「サービスとして」実行されます。これは、プロンプトを表示するユーザーがいないことを意味します。したがって、UACは、デフォルトで構成されているため、オンデマンドで「真の管理者」権限を付与できません。

どうやら、プロンプトを表示しないようにUACを構成し、代わりに権限を付与することができます(UACのセキュリティ上の利点があれば、それを無効にします)。たとえば このブログ投稿 を参照してください。より良い解決策は、「ローカル管理者」という膨大な名前の下にある安価な模倣ではなく、すでに真の管理者であるアカウントとしてサービスを実行することです。

4
Thomas Pornin

ACはシステムサービスに影響を与えるべきではありません。この質問は別として、これが影響するという証拠はありません。問題を再現することなく、Windows 7、Windows 10v1607、およびWindows 10v1803でテストしました。

これを引き起こしている特定のマシンに異常があるか、または問題が他の原因で発生している、たとえば、サービスのSIDタイプが制限に設定されている、または付与するACLが実行されていると結論付けますインタラクティブのみへのアクセス。

この問題が発生している今後の読者は、問題のトラブルシューティングの支援が必要な場合、私に電子メールで送信してください。私のメールアドレスはプロフィールにあります。

1
Harry Johnston

UACがシステムサービスに影響を与えることはありません。

ハリー、この明確な答えに感謝します:私は今まで長い間疑問に思っていました:-)。

Windows 2012R2コンテキストと#Requires -RunAsAdministratorタグ付きPowerShellスクリプトで本日テストされました:

  • 通常のインタラクティブセッションから実行している場合:次のエラーが発生しました:
.\script.ps1 : The script 'script.ps1' cannot be run because it contains a "#requires" statement
for running as Administrator. The current Windows PowerShell session is not running as Administrator. Start Windows
PowerShell by  using the Run as Administrator option, and then try running the script again.
  • 管理者モードのインタラクティブセッションから実行する場合(管理者として実行し、UACで確認):すべて問題ありません。
  • PowerShell -NonInteractive -File d:\pathto\script.ps1のみを実行するカスタムWindowsサービスから実行する場合:すべて問題ありません。

技術的な詳細については、WindowsサービスGo言語で記述されています( golang.org/x/sys/windows/svc):特定のマニフェストはありません。 WiX( https://wixtoolset.org )を介してデフォルトServiceInstallオプション(ownProcess + type auto)でインストールされ、ローカルでログオンするように設定されています管理者ユーザーアカウント。

したがって、おそらく、元の問題は、Windowsサービスがユーザーアカウントとしてログインしているユーザーアカウントに設定されているアクセス許可に関連しています。

1
Fabien KOCIK