管理者によるインストールが必要なNullsoftInstallSystemを使用してWindowsインストーラーを構築しようとしています。インストーラーは「ログ」ディレクトリを作成します。通常のユーザーはこのアプリケーションを実行できるため、そのディレクトリは通常のユーザーが書き込み可能である必要があります。すべてのユーザーがNSISスクリプト言語でそのディレクトリへの書き込みアクセス権を持つ必要があることを指定するにはどうすればよいですか?
これは一種の悪い考えのように聞こえますが、このアプリケーションは、プライベートネットワーク上の数人だけが使用する内部アプリにすぎません。何か悪いことが起こった場合にアプリが壊れた理由を確認できるように、ログファイルを保存する必要があります。ユーザーを管理者にすることはできません。
AccessControl プラグインを使用して、これをスクリプトに追加します。ここで、「logs」ディレクトリはインストールディレクトリにあります。
AccessControl::GrantOnFile "$INSTDIR\logs" "(BU)" "FullAccess"
これにより、すべてのユーザーがフォルダーに完全にアクセスできるようになります。
AccessControl::GrantOnFile "<folder>" "(BU)" "FullAccess"
は、Windows Server2008マシンでは機能しませんでした。代わりに私はこれを使わなければなりませんでした:
AccessControl::GrantOnFile "<folder>" "(S-1-5-32-545)" "FullAccess"
S-1-5-32-545は、 Microsoftサポート:Windowsオペレーティングシステムでよく知られているセキュリティ識別子 によると「ユーザー」と同等です。
Program Filesの下のディレクトリのアクセス許可を変更する代わりに、すべてのユーザーが書き込み可能な場所にログを配置してみませんか。
NSISドキュメントの4.9.7.7SetShellVarContextセクションを参照してください。 $ APPDATAとともに使用して、すべてのユーザーが書き込み可能なアプリケーションデータフォルダーを取得できます。
これは今では古い問題ですが、SörenAPPDATAディレクトリが示唆するように、必要なことを実行するための優れた方法です。ユーザーの個人的なAPPDATAではなく、「すべてのユーザー」のAPPDATAディレクトリを取得してください。このようにして、誰でもログファイルにアクセスできるようになります;-)
また、GrantOnFileで(BU)を使用すると、一部のシステムではうまく機能しないことをどこかで読みました(よく覚えている場合は、Win 7 x64)。代わりにSID「(S-1-5-32-545)」を使用する必要があります。 (これはすべてのユーザーのSIDであり、この値は各Windows OSで一定です)
ユーザーの%APPDATA%ディレクトリにログディレクトリを作成してみませんか?本当にすべてのログをインストールディレクトリに置く必要がありますか?どうして?