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())