Форум: "Прочее";
Текущий архив: 2008.07.27;
Скачать: [xml.tar.bz2];
ВнизИз Delphi в C# Найти похожие ветки
← →
bycka (2008-06-04 18:44) [0]Есть вот такой код Игоря Шевченко:
function CreateFullAccessSA(var SA: TSecurityAttributes): Boolean;
type
TAceHeader = packed record
AceType: Byte;
AceFlags: Byte;
AceSize: Word;
end;
TAccessAllowedAce = packed record
Header: TAceHeader;
Mask: ACCESS_MASK;
SidStart: DWORD;
end;
const
FILE_READ_DATA = $0001; // file & pipe
FILE_LIST_DIRECTORY = $0001; // directory
FILE_WRITE_DATA = $0002; // file & pipe
FILE_ADD_FILE = $0002; // directory
FILE_APPEND_DATA = $0004; // file
FILE_ADD_SUBDIRECTORY = $0004; // directory
FILE_CREATE_PIPE_INSTANCE = $0004; // named pipe
FILE_READ_EA = $0008; // file & directory
FILE_WRITE_EA = $0010; // file & directory
FILE_EXECUTE = $0020; // file
FILE_TRAVERSE = $0020; // directory
FILE_DELETE_CHILD = $0040; // directory
FILE_READ_ATTRIBUTES = $0080; // all
FILE_WRITE_ATTRIBUTES = $0100; // all
FILE_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED or Windows.SYNCHRONIZE or $1FF);
FILE_GENERIC_READ = (STANDARD_RIGHTS_READ or FILE_READ_DATA or
FILE_READ_ATTRIBUTES or FILE_READ_EA or Windows.SYNCHRONIZE);
FILE_GENERIC_WRITE = (STANDARD_RIGHTS_WRITE or FILE_WRITE_DATA or
FILE_WRITE_ATTRIBUTES or FILE_WRITE_EA or FILE_APPEND_DATA or Windows.SYNCHRONIZE);
FILE_GENERIC_EXECUTE = (STANDARD_RIGHTS_EXECUTE or FILE_READ_ATTRIBUTES or
FILE_EXECUTE or Windows.SYNCHRONIZE);
HEAP_ZERO_MEMORY = $00000008;
ACL_REVISION = 2;
SECURITY_WORLD_RID = $00000000;
SECURITY_WORLD_SID_AUTHORITY: TSidIdentifierAuthority = (Value: (0, 0, 0, 0, 0, 1));
var
pSD: PSecurityDescriptor;
psidEveryone: PSID;
sidAuth: TSidIdentifierAuthority;
lSDSize, lACLSize: Cardinal;
lpACL: PACL;
begin
Result := False;
pSD := nil;
psidEveryone := nil;
try
SA.nLength := SizeOf(TSecurityAttributes);
SA.lpSecurityDescriptor := nil;
SA.bInheritHandle := False;
sidAuth := SECURITY_WORLD_SID_AUTHORITY;
if not AllocateAndInitializeSid(sidAuth, 1, SECURITY_WORLD_RID, 0, 0, 0, 0,
0, 0, 0, psidEveryone) then begin
Exit;
end;
lSDSize := SizeOf(TSecurityDescriptor);
lACLSize := GetLengthSID(psidEveryone) + SizeOf(TAccessAllowedACE) + SizeOf(TACL);
pSD := HeapAlloc(GetProcessHeap, HEAP_ZERO_MEMORY, lSDSize + lACLSize);
if pSD = nil then begin
Exit;
end;
if not InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION) then begin
Exit;
end;
lpACL := PACL(PChar(pSD) + lSDSize);
if not InitializeAcl(lpACL^, lACLSize, ACL_REVISION) then begin
Exit;
end;
if not AddAccessAllowedAce(lpACL^, ACL_REVISION, FILE_ALL_ACCESS {FILE_GENERIC_READ
or FILE_GENERIC_WRITE}, psidEveryone) then begin
Exit;
end;
if not SetSecurityDescriptorDacl(pSD, True, lpACL, False) then begin
Exit;
end;
SA.lpSecurityDescriptor := pSD;
Result := True;
finally
if psidEveryone <> nil then
FreeSID(psidEveryone);
if (Result = False) and (pSD <> nil) then
HeapFree(GetProcessHeap, 0, pSD);
end;
end;
Встала необходимость перевести этот код на C# Сделал так:
BOOL
CreateAccessSA(
SECURITY_ATTRIBUTES * SA
)
{
SID_IDENTIFIER_AUTHORITY sidAuth = SECURITY_LOCAL_SID_AUTHORITY;
PSECURITY_DESCRIPTOR pSD;
PACL lpACL;
PSID psidEveryone;
DWORD lSDSize,
lACLSize;
BOOL Result = true;
SA->nLength = sizeof(SECURITY_ATTRIBUTES);
SA->bInheritHandle = false;
SA->lpSecurityDescriptor = NULL;
if (!AllocateAndInitializeSid(&sidAuth, 1, SECURITY_WORLD_RID, 0, 0, 0, 0,
0, 0, 0, &psidEveryone)) {
goto cleanup;
Result = false;
}
lSDSize = sizeof(SECURITY_DESCRIPTOR);
lACLSize = GetLengthSid(psidEveryone) + sizeof(ACCESS_ALLOWED_ACE) + sizeof(ACL);
if ((pSD = HeapAlloc(GetProcessHeap, HEAP_ZERO_MEMORY, lSDSize + lACLSize)) == NULL) {
goto cleanup;
Result = false;
}
if (!InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION)) {
goto cleanup;
Result = false;
}
lpACL = (PACL)pSD + lSDSize;
if (!InitializeAcl(lpACL, lACLSize, ACL_REVISION)) {
goto cleanup;
Result = false;
}
if (!AddAccessAllowedAce(lpACL, ACL_REVISION, FILE_ALL_ACCESS, psidEveryone)) {
goto cleanup;
Result = false;
}
if (!SetSecurityDescriptorDacl(pSD, true, lpACL, false)) {
goto cleanup;
Result = false;
}
SA->lpSecurityDescriptor = pSD;
cleanup:
if (psidEveryone != NULL)
FreeSid(psidEveryone);
if (pSD != NULL)
HeapFree(GetProcessHeap, 0, pSD);
return Result;
}
Вопрос вот в чем, проверить нет возможности даже синтаксис ибо нет никаких средств под рукой, может кто, что увидеть неправильного, не сочтите за труд сказать.
← →
bycka (2008-06-04 18:45) [1]Или может проверит кто на работоспособность, буду признателен.
← →
wl © (2008-06-04 19:07) [2]вообще-то ты перевел в C/C++
← →
palva © (2008-06-04 20:47) [3]Это как Паганель в книге Дети капитана Гранта -
вместо испанского языка по рассеянности выучил португальский.
← →
bycka (2008-06-04 21:36) [4]palva © (04.06.08 20:47) [3]
ухаха жжотес :D Да я запарился просто когда писал, конечно С/С++
← →
Игорь Шевченко © (2008-06-04 21:59) [5]
> конечно С/С++
В тырнете примеров как звезд на небе именно на С
← →
Eraser © (2008-06-05 00:42) [6]> [1] bycka (04.06.08 18:45)
можно немного упростить, если для win2k и выше, см. SetEntriesInAcl.
← →
rueus (2008-06-05 08:57) [7]И поменять надо местами:
goto cleanup;
Result = false;
а то перейдет и фальшь не присвоит результату
← →
bycka (2008-06-12 17:34) [8]
BOOL
CreateAccessSA(
SECURITY_ATTRIBUTES * SA,
DWORD AccessMask //FILE_ALL_ACCESS GENERIC_READ GENERIC_WRITE
)
{
SID_IDENTIFIER_AUTHORITY sidAuth = SECURITY_LOCAL_SID_AUTHORITY;
PSECURITY_DESCRIPTOR pSD;
PACL lpACL;
PSID psidEveryone;
DWORD lSDSize,
lACLSize;
BOOL Result = true;
SA->nLength = sizeof(SECURITY_ATTRIBUTES);
SA->bInheritHandle = false;
SA->lpSecurityDescriptor = NULL;
if (!AllocateAndInitializeSid(&sidAuth, 1, SECURITY_WORLD_RID, 0, 0, 0, 0,
0, 0, 0, &psidEveryone)) {
Result = false;
goto cleanup;
}
lSDSize = sizeof(SECURITY_DESCRIPTOR);
lACLSize = GetLengthSid(psidEveryone) + sizeof(ACCESS_ALLOWED_ACE) + sizeof(ACL);
if ((pSD = VirtualAlloc(NULL, lSDSize + lACLSize, MEM_COMMIT, PAGE_READWRITE)) == NULL) {
Result = false;
goto cleanup;
}
if (!InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION)) {
Result = false;
goto cleanup;
}
lpACL = (PACL)pSD + lSDSize;
if (!InitializeAcl(lpACL, lACLSize, ACL_REVISION)) {
Result = false;
goto cleanup;
}
if (!AddAccessAllowedAce(lpACL, ACL_REVISION, AccessMask, psidEveryone)) {
Result = false;
goto cleanup;
}
if (!SetSecurityDescriptorDacl(pSD, true, lpACL, false)) {
Result = false;
goto cleanup;
}
SA->lpSecurityDescriptor = pSD;
cleanup:
if (psidEveryone != NULL)
FreeSid(psidEveryone);
if ((Result == false) && (pSD != NULL))
VirtualFree(pSD,0,MEM_RELEASE);
return Result;
короче вот так работает, проверил.
← →
bycka (2008-06-12 17:35) [9]может кому пригодится :)
← →
wicked © (2008-06-12 17:55) [10]
>
> if ((pSD = VirtualAlloc(NULL, lSDSize + lACLSize, MEM_COMMIT,
> PAGE_READWRITE)) == NULL) {
> Result = false;
> goto cleanup;
> }
>
> if (!InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION))
> {
> Result = false;
> goto cleanup;
> }
>
> lpACL = (PACL)pSD + lSDSize;
>
> if (!InitializeAcl(lpACL, lACLSize, ACL_REVISION)) {
> Result = false;
> goto cleanup;
> }
жудь какая
видимо, "новые технологии" настолько затмевают, что без goto ну уж никак
← →
Игорь Шевченко © (2008-06-12 18:24) [11]
> видимо, "новые технологии" настолько затмевают, что без
> goto ну уж никак
goto тут вполне уместно
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2008.07.27;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.011 c