Как запустить сетевой процесс службы Windows для прослушивания порта на сокете localhost, который виден обычному пользователю под UAC? - PullRequest
0 голосов
/ 02 апреля 2010

Вот код (в стандартном TService в Delphi):

const
  ProcessExe = 'MyNetApp.exe';

function RunService: Boolean;
var
  StartInfo : TStartupInfo;
  ProcInfo : TProcessInformation;
  CreateOK : Boolean;
begin 
  CreateOK := false;
  FillChar(StartInfo,SizeOf(TStartupInfo),#0);
  FillChar(ProcInfo,SizeOf(TProcessInformation),#0);
  StartInfo.cb := SizeOf(TStartupInfo);
  CreateOK := CreateProcess(nil, PChar(ProcessEXE),nil,nil,False,
                    CREATE_NEW_PROCESS_GROUP+NORMAL_PRIORITY_CLASS,
                    nil, PChar(InstallDir), StartInfo, ProcInfo);
  CloseHandle(ProcInfo.hProcess);
  CloseHandle(ProcInfo.hThread);
  Result := CreateOK;
end;

procedure TServicel.ServiceExecute(Sender: TService);
const
  IntervalsBetweenRuns = 4; //no of IntTimes between checks
  IntTime = 250; //ms
var
  Count: SmallInt;
begin
  Count := IntervalsBetweenRuns;  //first time run immediately
  while not Terminated do
  begin
    Inc(Count);
    if Count >= IntervalsBetweenRuns then
    begin
      Count := 0;
      //We check to see if the process is running,
      //if not we run it. That's all there is to it.
      //if ProcessEXE crashes, this service host will just rerun it
      if processExists(ProcessEXE)=0 then
        RunService;
    end;
    Sleep(IntTime);
    ServiceThread.ProcessRequests(False);
  end;
end;

MyNetApp.exe - прокси-сервер SOCKS5, прослушивающий порт 9870. Пользователи настраивают свой браузер на этот прокси-сервер, который действует как безопасный туннель / анонимайзер.

Все прекрасно работает в 2000 / XP / 2003, но в Vista / Win7 с UAC служба работает в Session0 под LocalSystem, а порт 9870 не отображается в netstat для вошедшего в систему пользователя. или Администратор.

Кажется, UAC мешает мне.

Есть ли что-то, что я могу сделать с SECURITY_ATTRIBUTES или CreateProcess, или есть что-то, что я могу сделать с CreateProcessAsUser или олицетворением, чтобы гарантировать, что сетевой сокет в службе доступен для зарегистрированных пользователей в системе (обратите внимание, это приложение для массового развертывания, у меня нет доступа к учетным данным пользователя, и я требую, чтобы пользователь повысил свои привилегии для установки службы в Vista / Win7)

Ответы [ 2 ]

1 голос
/ 03 апреля 2010

Служба должна быть в состоянии прочитать куст HKLM. При создании дескриптора реестра убедитесь, что для параметра «Доступ» установлено значение KEY_READ (ARegHandle.Access: = KEY_READ;), а также при открытии ключа откройте в нем команду «Создать как ложь» или «OpenReadOnly».

0 голосов
/ 03 апреля 2010

Оказывается, что проблема не имеет ничего общего с портом, который не виден под netstat. Я запустил другой тест с предыдущей сборкой на машине с Win7, и даже когда netstat не показывает прослушивание порта как администратора или обычного пользователя, браузеры могут по-прежнему привязываться к порту (почему это так?)

На самом деле MyNetApp.exe не работает правильно (только в Win7), так как при запуске под учетной записью NT AUTHORITY \ SYSTEM он не может читать файлы в C: \ ProgramData \ (% ALLUSERPROFILE%) - ему нужны файлы, которые мой клиент помещает в подпапки там.

Когда я проверяю «Действующие разрешения» для пользователя SYSTEM для этих файлов, я получаю полный доступ.

Что происходит?

UPDATE: Нет, это тоже не так. MyNetApp.exe сообщают, где находятся его конфигурационные файлы, читая строку в HKEY_LOCAL_MACHINE \ SOFTWARE \ MyCompany \ MyApp \, которую я установил во время установки (в% ALLUSERPROFILE% \ MyCompany \ MyApp. Кажется, что получается пустая строка, которая почему NT AUTHORITY \ SYSTEM не получит ту же строку, что и та, которую я установил в установщике (работает с повышенными привилегиями, чтобы он мог установить службу)

...