ファイルの特定のアクセス権限を有効または無効にしようとしています。これを行うには、DACLをいじる必要があることがわかりました。次のコードを使用して、ファイルのDACLを変更しています。
void set_DACL_for_object(const char *object, SE_OBJECT_TYPE object_type,
int access_perms, int access_mode) {
PACL pDACL = NULL, pOldDACL = NULL;
PSECURITY_DESCRIPTOR pSD = NULL;
EXPLICIT_ACCESS ea;
GetNamedSecurityInfo((LPTSTR)object, object_type,
DACL_SECURITY_INFORMATION, NULL, NULL,
&pOldDACL, NULL, &pSD);
ZeroMemory(&ea, sizeof(EXPLICIT_ACCESS));
ea.grfAccessPermissions = access_perms;
ea.grfAccessMode = access_mode;
ea.grfInheritance = NO_INHERITANCE;
ea.Trustee.TrusteeForm = TRUSTEE_IS_NAME;
ea.Trustee.TrusteeType = TRUSTEE_IS_GROUP;
ea.Trustee.ptstrName = _T("ADMINISTRATORS");
SetEntriesInAcl(1, &ea, pOldDACL, &pDACL);
SetNamedSecurityInfo((LPTSTR)object, object_type,
DACL_SECURITY_INFORMATION, NULL, NULL, pDACL, NULL);
}
したがって、最初にfopen()を使用してファイルを作成し、Administratorsグループへのすべてのアクセスを許可するACLを作成してから、Administratorsグループへの書き込みアクセスを拒否します。
set_DACL_for_object("C:\\file.txt", SE_FILE_OBJECT, GENERIC_ALL, SET_ACCESS);
set_DACL_for_object("C:\\file.txt", SE_FILE_OBJECT, GENERIC_WRITE, DENY_ACCESS);
ただし、これらの呼び出しの後、ファイルへの読み取りアクセス権がありません。電話をかけない場合は、読み取り/書き込みアクセス権があります(予想どおり)。
管理者アカウントで実行していて、関数が正常に返されていることに注意してください。また、特定の制限されたユーザーのACLを変更しようとしましたが、同じことが起こります...ユーザーは、希望どおりに書き込みアクセスではなく、読み取りアクセスを拒否されます。
DENY_ACCESSをREVOKE_ACCESSに、SET_ACCESSをGRANT_ACCESSに、SET_ACCESS呼び出しを行わないなど、set_DACL_for_object()のさまざまな呼び出しの組み合わせを試しましたが、何も機能しないようです。
ほとんどのコードはこのMSDNの例から取得されたものであるため、機能するはずです。私は正確に何を間違っているのですか?