2

CreateSymbolicLinkW() 関数 (Kernel32.dll から) を使用してシンボリック リンクを作成しようとしています。

それぞれのマシン (Win7 Pro x64 SP1) で:

  • UAC が有効になっている(= ローカル管理者権限を持つユーザーのプロセスは、デフォルトでは昇格されていません)
  • すべての認証済みユーザーに「シンボリック リンクの作成」ユーザー権利の割り当てを許可しました (コンピューター -> Windows の設定 -> セキュリティ -> ローカル ポリシー -> ユーザー権利の割り当て -> シンボリック リンクの作成 = 認証済みユーザーのグループ ポリシーを通じて)
  • 考えられるすべてのシンボリック リンクの評価の種類を有効にしました (これもグループ ポリシー設定により)。(「fsutil 動作クエリ SymlinkEvaluation」を確認するには、「ローカルからローカルへのシンボリック リンクが有効になっています。ローカルからリモートへのシンボリック リンクが有効になっています。リモートからローカルへのシンボリック リンクが有効になっています。リモートからリモートへのシンボリック リンクが有効になっています。」

現在の状況は次のとおりです。

  • UNELEVATEDプロセスで非管理者ユーザーとしてCreateSymbolicLinkW()を実行すると、機能します(シンボリックリンクが作成されました)
  • ELEVATEDプロセスでADMINユーザーとしてCreateSymbolicLinkW()を実行すると、機能します(シンボリックリンクが作成されました)
  • 昇格されていない (!) プロセスで ADMIN (!) ユーザーとして CreateSymbolicLinkW() を実行すると、機能しません

最後のケースが実際の問題です。GetLastError によって返されるエラーは次のとおりです: 1314 (= "必要な権限がクライアントによって保持されていません") .

昇格されていないシェルの管理者以外のユーザーには機能するのに、昇格されていないプロセスの管理者ユーザーには失敗するのはなぜですか?

私のコードは、できれば昇格されていないプロセスで、あらゆるタイプのユーザーによって実行されることを意図しています。回避策として管理者ユーザーにプロセスの昇格を依頼することは、どのような状況でも避けたいと思います。

同じ動作は、Windows シェルの MKLINK コマンドでも再現できます(昇格されていないシェルの管理者ユーザーには失敗しますが、昇格されていないシェルのすべての非管理者ユーザーには機能します)。

Python 2.7 のサンプル コード:

import ctypes
CreateSymbolicLinkW = ctypes.WinDLL("Kernel32").CreateSymbolicLinkW
CreateSymbolicLinkW(u"c:\\linktest\\testlink.txt", u"c:\\linktest\\testtarget.txt",0)
print(ctypes.WinDLL("Kernel32").GetLastError())
4

1 に答える 1

6

観察された動作は UAC によるものであり、管理者ユーザーにはデフォルトで制限されたトークンが与えられます。このトークンは、通常の管理者ユーザーのトークンを取得し、それをフィルタリングしてさまざまな管理者特権を削除することにより、自動的に作成されます。

whoami /privDOS プロンプトでコマンドを実行すると、トークンにどのような権限があるかを確認できます。昇格されたプロンプトからのトークンには、シンボリック リンクの作成権限など、昇格されていないプロンプトからの権限よりもはるかに多くの権限が付与されます。

残念ながら、これはまさに UAC が動作するように設計されているため、これを回避する方法があるとは思いません。UACを完全に無効にする以外に、管理者トークンのフィルタリング方法を制御する方法はないと思います。これが重要な問題です。

于 2015-03-15T19:18:21.377 に答える