Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.07.27;
Скачать: CL | DM;

Вниз

Из 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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.019 c
15-1211663863
Германн
2008-05-25 01:17
2008.07.27
Насколько же я могу быть тупым!


1-1195488425
DevilDevil
2007-11-19 19:07
2008.07.27
Получить Call-Stack


2-1214474241
Fobiya
2008-06-26 13:57
2008.07.27
Реакция на нажатие правой кнопки мыши


15-1212760713
Vlad Oshin
2008-06-06 17:58
2008.07.27
моя плакаю. Бросаем delphi, переходим на С под NET


2-1214307469
uno-84
2008-06-24 15:37
2008.07.27
Ссылка в тексте