如何启动Windows服务网络进程以侦听UAC下普通用户可见的localhost套接字上的端口?

时间:2010-04-02 11:14:32

标签: windows sockets service networking uac

这是代码(在Delphi的标准TService中):

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是一个侦听端口9870的SOCKS5代理。用户将其浏览器配置为此代理,充当安全隧道/匿名者。

所有在2000 / XP / 2003上完全正常,但在使用UAC的Vista / Win7上,服务在LocalSystem下的Session0中运行,而端口9870在 netstat 中没有显示为登录用户管理员。

似乎UAC正在阻碍我。

我可以使用SECURITY_ATTRIBUTES或CreateProcess做些什么,或者我可以使用CreateProcessAsUser或模拟来确保服务上的网络套接字可用于系统上的登录用户(注意,此应用程序)用于大规模部署,我无权访问用户凭据,并要求用户提升其权限以在Vista / Win7上安装服务)

2 个答案:

答案 0 :(得分:1)

服务应该能够阅读HKLM配置单元。 创建注册表句柄时,请确保将Access设置设置为KEY_READ(ARegHandle.Access:= KEY_READ;)以及打开密钥时,使用Create as false或OpenReadOnly打开它。

答案 1 :(得分:0)

原来这个问题与netstat下不可见的端口无关。我在Win7机器上运行了先前构建的另一个测试,即使netstat没有显示端口正在侦听管理员或普通用户,那么浏览器仍然可以绑定到端口(为什么会这样?)

实际发生的是MyNetApp.exe无法正常运行(仅在Win7上),因为在NT AUTHORITY \ SYSTEM帐户下运行时,它无法读取C:\ ProgramData \(%ALLUSERPROFILE%)中的文件 - 它需要我的客户端放在那里的子文件夹中的文件。

当我在这些文件上检查SYSTEM用户的“有效权限”时,我正在获得完全控制权。

发生了什么事?

更新: 不,那也不是。通过读取我在安装期间设置的HKEY_LOCAL_MACHINE \ SOFTWARE \ MyCompany \ MyApp \中的字符串,告诉MyNetApp.exe它的配置文件在哪里(到%ALLUSERPROFILE%\ MyCompany \ MyApp。看起来它是一个空字符串,这是为什么NT AUTHORITY \ SYSTEM不能获得与我在安装程序中设置的字符串相同的字符串(使用提升的权限运行以便安装服务)