Вот код (в стандартном 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)