Всем привет. Кто знает как получить права фолдера нтфс?
Т.е необходимо в свою гую вывести галочки такие же как и
правой кнопкой по папке -> свойства -> безопасность.
Сейчас юзаю примерно такой код.
Проблема в том чтоне совсем понятно как корректно разобрать
ACCESS_MASK и какие кода будут когда несколько галок одновременно поставить.
WTL::CString CPipeServer::GetNTFSPermission(WTL::CString Data)
{
WTL::CString NewDestination;
LPTSTR pszObjName; // name of object
SE_OBJECT_TYPE ObjectType; // type of object
DWORD dwRes = 0;
PACL pOldDACL = NULL;
PSECURITY_DESCRIPTOR pSD = NULL;
DebugBreak();
if (NULL == Data.GetLength())
{
return ERROR_INVALID_PARAMETER;
}
TCHAR* fileName = new TCHAR[Data.GetLength() + 1];
_stprintf(fileName,_T("%s"),Data);
dwRes = GetNamedSecurityInfo(fileName, SE_FILE_OBJECT,
DACL_SECURITY_INFORMATION,
NULL, NULL, &pOldDACL, NULL, &pSD);
if (ERROR_SUCCESS != dwRes)
{
goto Cleanup;
}
ULONG pcCountOfExplicitEntries = 0;
EXPLICIT_ACCESS *pListOfExplicitEntries;
dwRes = GetExplicitEntriesFromAcl(
pOldDACL, &pcCountOfExplicitEntries, &pListOfExplicitEntries );
if (ERROR_SUCCESS != dwRes)
{
goto Cleanup;
}
for (int nIndex = 0; nIndex < pcCountOfExplicitEntries; nIndex++)
{
NewDestination += "ACCESS_MODE&";
switch( pListOfExplicitEntries[nIndex].grfAccessMode)
{
case NOT_USED_ACCESS: NewDestination += "NOT_USED_ACCESS"; break;
case GRANT_ACCESS: NewDestination += "GRANT_ACCESS"; break;
case SET_ACCESS: NewDestination += "SET_ACCESS"; break;
case DENY_ACCESS: NewDestination += "DENY_ACCESS"; break;
case REVOKE_ACCESS: NewDestination += "REVOKE_ACCESS"; break;
case SET_AUDIT_SUCCESS: NewDestination += "SET_AUDIT_SUCCESS"; break;
case SET_AUDIT_FAILURE: NewDestination += "SET_AUDIT_FAILURE"; break;
}
NewDestination += "*grfAccessPermissions&";
TCHAR* codeBuffer = new TCHAR[256];
ZeroMemory(codeBuffer,256);
_ultow_s( pListOfExplicitEntries[nIndex].grfAccessPermissions, codeBuffer, 256, 10 );
NewDestination+=codeBuffer;
delete[] codeBuffer;
NewDestination += "*";
}
Cleanup:
if(pSD != NULL)
LocalFree((HLOCAL) pSD);
delete[] fileName;
return NewDestination;
}
Добавил разметку — Кодт
12.12.08 15:58: Перенесено модератором из 'C/C++' — Кодт
S>Проблема в том чтоне совсем понятно как корректно разобрать
S>ACCESS_MASK и какие кода будут когда несколько галок одновременно поставить.
А чего непонятного-то? EXPLICIT_ACCESS у тебя есть, там всё что нужно содержится. В частности:
Имя объекта в EXPLICIT_ACCESS.Trustee.ptstrName.
Тип идентификатора (имя, SID, etc) в EXPLICIT_ACCESS.Trustee.TrusteeForm.
Тип объекта (пользователь, группа, etc) в EXPLICIT_ACCESS.Trustee.TrusteeType.
Режим доступа (разрешаем, запрещаем, etc) в EXPLICIT_ACCESS.grfAccessMode.
Разрешения в EXPLICIT_ACCESS.grfAccessPermissions.
Что касается разрешения для файлов, то они перечислены в
File Security and Access Rights.