Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.07.30;
Скачать: [xml.tar.bz2];

Вниз

Подключение пользователя с ограничеными правами к 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.01 c
15-1151833354
kaif
2006-07-02 13:42
2006.07.30
Расшифрована структура энзима, вызывающего рак


5-1135933137
FrykT
2005-12-30 11:58
2006.07.30
Канва, текст, и... мышка


2-1152548116
AlexanderMS
2006-07-10 20:15
2006.07.30
Запись WideString в файл.


15-1152050166
Footballer
2006-07-05 01:56
2006.07.30
Зацините audioplayer


15-1151413524
NORDmen
2006-06-27 17:05
2006.07.30
перевод слов/предложений с помошью программ-переводчиков





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский