这是代码(在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上安装服务)
答案 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不能获得与我在安装程序中设置的字符串相同的字符串(使用提升的权限运行以便安装服务)