Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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.49 MB
Время: 0.007 c
1-1195488425
DevilDevil
2007-11-19 19:07
2008.07.27
Получить Call-Stack


1-1196142387
Kolan
2007-11-27 08:46
2008.07.27
Как в InnoSetUp настроить ярлыки на опр. файл?


15-1213126413
wl
2008-06-10 23:33
2008.07.27
oracle getting started


2-1214392684
Stif
2008-06-25 15:18
2008.07.27
Как сократить


15-1213008836
андр.
2008-06-09 14:53
2008.07.27
Interface





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский