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

Вниз

Подключение пользователя с ограничеными правами к NamedPipe серве   Найти похожие ветки 

 
learner ©   (2006-07-11 13:09) [0]

Здравствуйте !
На стороне сервера создаю канал так :
hTempPipe:=CreateNamedPipe(PChar("\\.\PIPE\"+ServName),
                          PIPE_ACCESS_DUPLEX or  
                          FILE_FLAG_OVERLAPPED,  
                          PIPE_WAIT or                          
                          PIPE_READMODE_MESSAGE or PIPE_TYPE_MESSAGE,
                          Length(FClients),                          
                          BufSize, BufSize,                        
                          TIME_OUT, nil);//@Fsa);

Все хорошо, только, если к серверу пытается присоединиться клиент,
стартовавший под пользователем с ограниченными правами, то он
получает ответ: нет доступа.
Как разрешить всем подключаться к серверу ?


 
Игорь Шевченко ©   (2006-07-11 16:03) [1]


> Как разрешить всем подключаться к серверу ?


Создать нужный SecurityDestriptor, очевидно.

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;


var
 SA: TSecurityAttributes;
...
 if not CreateFullAccessSA(SA) then
   RaiseLastWin32Error;
hTempPipe:=CreateNamedPipe(PChar("\\.\PIPE\"+ServName),
                         PIPE_ACCESS_DUPLEX or  
                         FILE_FLAG_OVERLAPPED,  
                         PIPE_WAIT or                          
                         PIPE_READMODE_MESSAGE or PIPE_TYPE_MESSAGE,
                         Length(FClients),                          
                         BufSize, BufSize,                        
                         TIME_OUT, @SA);


 
learner ©   (2006-07-11 20:00) [2]

>[1] Игорь Шевченко ©   (11.07.06 16:03)
Спасибо огромное : отлично работает !
И еще хочется сделать так, чтобы присоединяться - присоединялись, но воспользоваться чем-нибудь типа ImpersonateNamedPipeClient
не могли. Как это можно реализовать ?
P.S. Наверное, моя наглость не знает границ :))


 
learner ©   (2006-07-11 20:02) [3]

Забыла
А, если CreateFullAccessSA прошла успенно, то после того как сервер
уже не нужен и закрыт надо ли вызывать HeapFree(GetProcessHeap, 0, pSD) ?



Страницы: 1 вся ветка

Текущий архив: 2006.07.30;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.028 c
15-1151784673
kolyann..
2006-07-02 00:11
2006.07.30
help!!!


1-1150649616
AlexAlex
2006-06-18 20:53
2006.07.30
Можно ли отрезать кусок от файла без копирования его содержимого?


15-1151556036
Ega23
2006-06-29 08:40
2006.07.30
С Днём рождения! 29 июня


2-1152603329
levin_610
2006-07-11 11:35
2006.07.30
registraciia servisov


9-1132456729
s3m
2005-11-20 06:18
2006.07.30
Как выводить трекерские файлы через GLScene?