Если кому интересно и кто занимался этим, помогите, пож-та. Есть пара мест в коде, что вызывают сомнения (но не больше). Но дело в том, что доступ к файлу не меняется после прогона программы. Эта прога должна смотреть, кому можно работать с файлом (каждому - свой вид работы, то есть чтение, запуск, запись. Это можно посмотреть в свойствах файла (папки) во вкладке Безопасность). А потом менять доступ разным группам (это задаётся непосредственно в коде - простой вариант). Почему?
| Код | #include <iostream.h> #include <windows.h> #include <aclapi.h>
#define NUM_OF_ACES 4;
void main() { SID_IDENTIFIER_AUTHORITY SecurNTAuth = SECURITY_NT_AUTHORITY;
char pFileName[50]; PACL pOldAcl = NULL; PACL pNewAcl = NULL; PSECURITY_DESCRIPTOR psd = NULL; PSID pSid; EXPLICIT_ACCESS ea; ////////////////////////////////////////////////////////////////////////// if (!AllocateAndInitializeSid( &SecurNTAuth, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_POWER_USERS, 0, 0, 0, 0, 0, 0, &pSid)) { cout << "Error while allocating power user's SID: " << GetLastError() << endl; } //////////////////////////////////////////////////////////////////////////
strcpy(pFileName, "c:\myfile.txt"); ////////////////////////////////////////////////////////////////////////// if (!GetNamedSecurityInfo( pFileName, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, &pOldAcl, NULL, &psd)) { cout << "Couldn't get named security info: " << GetLastError() << endl; } ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// ea.grfAccessMode = GRANT_ACCESS; ea.grfAccessPermissions = GENERIC_ALL; ea.grfInheritance = INHERIT_ONLY_ACE; ea.Trustee.MultipleTrusteeOperation = NO_MULTIPLE_TRUSTEE; ea.Trustee.pMultipleTrustee = NULL; ea.Trustee.TrusteeForm = TRUSTEE_IS_SID; ea.Trustee.TrusteeType = TRUSTEE_IS_GROUP; ////////////////////////////////////////////////////////////////////////// ea.Trustee.ptstrName = (LPTSTR)LocalAlloc(LMEM_FIXED, GetLengthSid(pSid)); ea.Trustee.ptstrName = (LPTSTR)pSid; //CopySid(GetLengthSid(pSid), (PSID)ea.Trustee.ptstrName, pSid); //cout << GetLengthSid(ea.Trustee.ptstrName) << endl; ////////////////////////////////////////////////////////////////////////// if (SetEntriesInAcl( 1, &ea, pOldAcl, &pNewAcl) != ERROR_SUCCESS) { cout << "Couldn't set entries in ACL: " << GetLastError() << endl; } //////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////// if (!SetNamedSecurityInfo( pFileName, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, pNewAcl, NULL)) { cout << "Couldn't set named security info: " << GetLastError() << endl; } ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// // Free mem if (psd != NULL) LocalFree(psd); if (pOldAcl != NULL) LocalFree(pOldAcl); if (pNewAcl != NULL) LocalFree(pNewAcl); if (pSid != NULL) LocalFree(pSid); ////////////////////////////////////////////////////////////////////////// return; } | |