Форум: "Начинающим";
Текущий архив: 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.012 c