Именованные каналы от службы Windows к клиентскому приложению

Моя история такова, что я разрабатываю новое приложение, которое должно взаимодействовать со службой Windows. После долгих исследований у меня есть пришли к выводу, что именованные каналы являются рекомендуемым методом ( Как мне отправить строку из одного экземпляра моей программы Delphi в другой? ), однако оказывается, что я не могу использовать SendMessage или именованные каналы в Win7 из-за проблем с безопасностью ... сообщения никогда не доходят до приложения за пределами службы.

Я использую именованные компоненты Pipe Рассела Либби, которые работают без сбоев между обычными настольными приложениями, но служба Windows, похоже, бросает ключ в решении. Дальнейшие исследования показывают мне, что, возможно, можно будет обеспечить безопасность с обеих сторон, чтобы позволить им общаться, однако мой уровень знаний по этому вопросу в лучшем случае минимален, и я не мог придумать или хвосты возможных вызовов API.

На основе в компоненте Delphi pipe.pas, что нужно сделать, чтобы открыть этого ребенка, чтобы обе стороны могли начать разговор? Я уверен, что следующие две функции из файла pipe.pas идентифицируют атрибуты безопасности, может ли кто-нибудь мне помочь?

Спасибо!

procedure InitializeSecurity(var SA: TSecurityAttributes);
var
  sd: PSecurityDescriptor;
begin

  // Allocate memory for the security descriptor
  sd := AllocMem(SECURITY_DESCRIPTOR_MIN_LENGTH);

  // Initialize the new security descriptor
  if InitializeSecurityDescriptor(sd, SECURITY_DESCRIPTOR_REVISION) then
  begin
    // Add a NULL descriptor ACL to the security descriptor
    if SetSecurityDescriptorDacl(sd, True, nil, False) then
    begin
      // Set up the security attributes structure
      SA.nLength := SizeOf(TSecurityAttributes);
      SA.lpSecurityDescriptor := sd;
      SA.bInheritHandle := True;
    end
    else
      // Failed to init the sec descriptor
      RaiseWindowsError;
  end
  else
    // Failed to init the sec descriptor
    RaiseWindowsError;

end;

procedure FinalizeSecurity(var SA: TSecurityAttributes);
begin

  // Release memory that was assigned to security descriptor
  if Assigned(SA.lpSecurityDescriptor) then
  begin
    // Reource protection
    try
      // Free memory
      FreeMem(SA.lpSecurityDescriptor);
    finally
      // Clear pointer
      SA.lpSecurityDescriptor := nil;
    end;
  end;

end;

10
задан Community 23 May 2017 в 11:44
поделиться