0

Windows 7 では、SCSI 経由で接続された特定のディスクへの読み取り/書き込みアクセスをユーザー グループに付与して、そのディスクに対して読み取り/書き込みを行うユーティリティを実行できるようにしようとしています。C++ を使用して SetNamedSecurityInfo を使用してディスク オブジェクトの DACL を変更することで、これを実行しようとしています。

    string devicePath = "\\?\scsi#disk&ven_wsi&prod_drs1100p#6&383ae3b6&0&000300#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}";
    PSID ppsidOwner, ppsidGroup;
    PACL ppDacl = NULL, ppSacl = NULL;
    PSECURITY_DESCRIPTOR ppSecurityDescriptor = NULL;
    char objName[200];
    strcpy(objName, devicePath.c_str());

    // Get SecurityInfo
    GetNamedSecurityInfoA(objName, 1, DACL_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | OWNER_SECURITY_INFORMATION, &ppsidOwner, &ppsidGroup, &ppDacl, NULL, &ppSecurityDescriptor);

    // Build ACE
    EXPLICIT_ACCESS str_ACE;
    DWORD rightsMask = STANDARD_RIGHTS_ALL | GENERIC_ALL | GENERIC_WRITE | GENERIC_READ;
    BuildExplicitAccessWithNameA(&str_ACE, "DRS Operators", rightsMask, GRANT_ACCESS, NO_INHERITANCE);
    PACL newPACL;

    // Set ACE then Set SecurityInfo
    SetEntriesInAclA(1, &str_ACE, ppDacl, &newPACL);
    SetNamedSecurityInfoA(objName, 1, DACL_SECURITY_INFORMATION, NULL, NULL, newPACL, NULL);

私が書いたコードは機能しているようです。DACL を変更する前後にオブジェクトで GetNamedSecurityInfoA を使用し、受信した SecurityDescriptors を ConvertSecurityDescriptorToStringSecurityDescriptorA に渡し、それらが変更されていることを確認して確認しました。このコードを実行した後、「DRS Operators」ユーザー グループの任意のユーザーとしてログインでき、ディスクの読み取り/書き込みができるようになりました。

私が抱えている唯一の問題は、システムのシャットダウン後に DACL への変更が保持されないことです。再起動後、DACL は上記のコードを実行する前の状態に戻ります (GetNamedSecurityInfoA を使用して確認しました)。変更が持続しない理由を知っている人はいますか?

4

0 に答える 0