NetworkService アカウントがキーにアクセスできるようにプログラムで許可するために、次のコードを使用しています。
var RSA = new RSACryptoServiceProvider(
new CspParameters() {
KeyContainerName = "MyEncryptionKey",
Flags = CspProviderFlags.UseExistingKey | CspProviderFlags.UseMachineKeyStore
});
RSA.CspKeyContainerInfo.CryptoKeySecurity.AddAccessRule(
new System.Security.AccessControl.CryptoKeyAccessRule(
new SecurityIdentifier(WellKnownSidType.NetworkServiceSid, null),
CryptoKeyRights.GenericAll,
AccessControlType.Allow
)
);
このコードはエラーなしで実行されますが、キー コンテナーのアクセス許可には影響しません。
ただし、コマンドライン ツール aspnet_regiis を使用して同じことを行うと、完全に機能します。
aspnet_regiis -pa "MyEncryptionKey" "NetworkService"
完全な管理者権限で実行しています。これらの権限で実行していない場合、例外がスローされます。また、最初にキーを作成したユーザーとして実行しています。
キー コンテナには、常に次のアクセス ルールがあります。
S-1-5-18 -> LocalSystem
S-1-5-32-544 -> Administrators
S-1-5-5-0-135377 -> MyUser
aspnet_regiis を使用すると、SID S-1-5-20 がこのリストに追加されます。コードから影響を与えることはできません。
AddAccessRule の代わりに SetAccessRule を使用するだけでなく、sid からセキュリティ識別子を文字列形式で作成しようとしました。
コードからこの ACL リストに実際に影響を与える方法はありますか?