3

ファイルの特定のアクセス権限を有効または無効にしようとしています。これを行うには、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の例から取得されたものであるため、機能するはずです。私は正確に何を間違っているのですか?

4

2 に答える 2

4

どのプログラムで開いて読んでください。ACLは私が期待したものに設定されましたが、FILE_GENERIC_WRITEは目的に対して一般的すぎる可能性があります。これは、属性の読み取りに影響を与える「特別な」権限も設定しているようです。

winnt.hから:

#define FILE_GENERIC_WRITE        (STANDARD_RIGHTS_WRITE    |\
                                   FILE_WRITE_DATA          |\
                                   FILE_WRITE_ATTRIBUTES    |\
                                   FILE_WRITE_EA            |\
                                   FILE_APPEND_DATA         |\
                                   SYNCHRONIZE)

より限定されたフラグのセットを使用して呼び出すと、少なくともメモ帳でテストファイルを開いて読み取ることができますが、管理者ユーザーはドキュメントを保存できません。

DWORD dwCustomWrite = FILE_WRITE_DATA       | 
                      FILE_WRITE_ATTRIBUTES | 
                      FILE_WRITE_EA         | 
                      FILE_APPEND_DATA;
set_DACL_for_object(..., SE_FILE_OBJECT, dwCustomWrite, DENY_ACCESS);

ファイルの[セキュリティ]タブの高度なアクセス許可リストで、上記の呼び出しでは、「administrators」グループに対して「deny」としてマークされているのは次の場合のみです。

「ファイルの作成/データの書き込み」、「フォルダの作成/データの追加」、「属性の書き込み」、「拡張属性の書き込み」

この知識があれば、必要なフラグの正確なセットを選択できるはずです。

于 2009-07-08T16:11:25.193 に答える
1

呼び出しでは、とではなく、とset_DACL_for_objectを指定する必要があると思います。これらの変更を加えてコードスニペットをコンパイルしましたが、期待どおりに機能しました。FILE_ALL_ACCESSFILE_GENERIC_WRITEGENERIC_ALLGENERIC_WRITE

LPTSTRちなみに、これをUnicodeとしてコンパイルする必要がある場合、キャストはこのコードがAnsiであることをコンパイラが検出できないため、この場合、コードは実行時に失敗します。

_T("ADMINISTRATORS")代わりに使用する必要があります。

于 2009-07-08T02:44:03.030 に答える