Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何启动Windows服务网络进程以侦听本地主机套接字上的端口,该端口在UAC下对普通用户可见?_Windows_Sockets_Service_Networking_Uac - Fatal编程技术网

如何启动Windows服务网络进程以侦听本地主机套接字上的端口,该端口在UAC下对普通用户可见?

如何启动Windows服务网络进程以侦听本地主机套接字上的端口,该端口在UAC下对普通用户可见?,windows,sockets,service,networking,uac,Windows,Sockets,Service,Networking,Uac,下面是代码(在Delphi中的标准TService中): MyNetApp.exe是在端口9870上侦听的SOCKS5代理。用户将其浏览器配置为此代理,该代理充当安全隧道/匿名器 所有这些在2000/XP/2003上都可以正常工作,但在带有UAC的Vista/Win7上,该服务在LocalSystem下的Session0中运行,并且对于登录的用户或管理员,端口9870不会显示在netstat中 看来UAC挡住了我的路 我是否可以使用SECURITY_属性或CreateProcess做些什么,或者

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

MyNetApp.exe是在端口9870上侦听的SOCKS5代理。用户将其浏览器配置为此代理,该代理充当安全隧道/匿名器

所有这些在2000/XP/2003上都可以正常工作,但在带有UAC的Vista/Win7上,该服务在LocalSystem下的Session0中运行,并且对于登录的用户或管理员,端口9870不会显示在netstat中

看来UAC挡住了我的路


我是否可以使用SECURITY_属性或CreateProcess做些什么,或者使用CreateProcessAsUser或模拟做些什么,以确保服务上的网络套接字可供系统上登录的用户使用(注意,此应用程序用于大规模部署,我没有访问用户凭据的权限,需要用户提升其权限才能在Vista/Win7上安装服务)

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

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

当我检查系统用户对这些文件的“有效权限”时,我将获得完全控制权

发生什么事了

更新:
不,也不是这样。MyNetApp.exe通过读取我在安装过程中设置的HKEY\U LOCAL\U MACHINE\SOFTWARE\MyCompany\MyApp\中的字符串被告知其配置文件的位置(对于%ALLUSERPROFILE%\MyCompany\MyApp。似乎它得到的是一个空字符串,这正在破坏它。究竟为什么NT AUTHORITY\SYSTEM不会得到与我在安装程序中设置的字符串相同的字符串(以提升的权限运行,以便安装服务)

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

这就是问题所在,谢谢。我没有对NetApp中的Reg权限给予足够的关注,并且错误地指出了为什么它在调试时工作,但在作为NT AUTHORITY\SYSTEM运行时不工作
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;