java - 我希望我的服务在不提升的情况下运行,但作为恰好是管理员的用户(Windows/UAC)

标签 java windows service permissions uac

就像标题所说的那样,我编写了一个在“后台”运行的程序,最好是作为Windows服务运行。 (如果这很重要的话,它是用Java编写的,并且由tanuki包装器提供了服务部分。此外,我正在运行Vista,但是我假设在所有带有UAC的Windows版本上都会发生这种情况。)作为“用户X”。

我还有一个配套的GUI程序,通常从开始菜单(无特权-即'asInvoker')-也作为“用户X”运行。

后台程序(也称为服务)创建文件。我的主要需求是使未提升的GUI程序能够读取,写入和删除由服务创建的这些文件。

只要“用户X”不是Administrators组的成员,就可以轻松进行此操作。 (当然,创建该服务需要管理员登录,但这没关系。)

如果我关闭UAC,或者如果我不是作为服务运行后台程序,则它也可以工作(例如,从命令提示符下)。

但是当“用户X”是Administrators的成员并且后台程序作为服务运行时,我只是无法使其正常工作。

此问题的症状是,进程浏览器将我的服务进程显示为特权运行(我从进程属性的“安全性”选项卡中收集了该信息,其中显示了“BUILTIN\Administrators-Owner”)。此外,该服务创建的所有文件均归“管理员”所有。

如果我从命令提示符下无特权运行后台程序,则进程浏览器将显示“BUILTIN\Administrators-Deny”,并且该程序创建的所有文件均由“User X”拥有。

最佳答案

有趣的问题。我只是查询了一些信息,但似乎并没有按照最初的要求为您的问题找到答案,但是我有一些替代建议。

首先,更改服务应用程序以使其创建所需的文件,然后将其权限更改为所需的权限是否可行?

其次,服务本身是否真的必须以“用户X”身份运行?如果是这样,为什么?有什么办法可以解决这个限制?如果您可以绕过该要求,那么您只需让普通用户运行该服务即可。

第三,您最好说是一项服务,但并不是必须的。使用的环境是否允许您使用计划任务?任务计划程序本身作为系统服务运行,并生成其他进程来完成您设置的任务。而且,在设置计划任务时,有一个选项(如果使用的是GUI界面,则为复选框),以是否具有最高特权来运行任务。如果采用这种方式,则可以在登录时运行任务,也可以在系统启动时运行任务(在这种情况下,请确保未选择“仅在登录后运行”)。否则,这应类似于您的服务设置。

根据您的以下评论,我认为第三条建议可能仍然是一个选择。通过使程序以自己的方式处理它,您仍然可以拥有与服务相似的状态信息。您的应用程序可能会打开一个套接字以进行跨进程通信。后台进程可以在已知端口上打开ServerSocket,并且可以监听状态请求。

用户正在使用的客户端应用程序可能会尝试连接到此套接字。如果套接字已连接,则表明该进程正在运行,否则没有运行。

如果只需要“正在运行/未在运行”状态,这就足够了,ServerSocket可以接受()连接,然后立即关闭并关闭生成的Socket;您甚至不需要接受或发送任何信息,因为您只需要初始连接。

如果要保留启动/关闭任务的功能,则可以将此相同的ServerSocket用于该功能。如果您没有将套接字用于其他任何数据(仅用于上面提到的运行或未使用),则可以使后台进程在套接字上接收到任何数据后终止,无论它是什么,并且客户端(或用于关闭后台进程的任何客户端)仅需要连接并发送一个字节,而不需要连接并立即断开连接。

对于启动,如果您希望将后台进程限制为一个实例,则有几种方法可以轻松地做到这一点。我认为您应该能够通过任务计划程序将其配置为仅允许任务的一个实例。即使没有,您也可能有一个后台进程启动连接到给定端口的连接,否则它将监听以查看是否从已有的其他端口获得连接,如果是,这是它的第二个实例,因此中止。或者,甚至更简单的是,如果您使用的是静态端口号,则ServerSocket的创建应该会自动失败,因此只需让新的ServerSocket(myPort)自行失败,捕获异常并中止。因此,可以通过三种不同的方法来确保您的流程像正常的服务一样运作。

首先要启动它,您可以告诉任务计划程序在用户登录或如上所述的系统启动时启动它。您还可以配置任务,以便用户可以自己启动它(如果由于某种原因它尚未运行),实际上,您甚至可以让用户与之交互的客户端检查进程的状态,并可能自动启动它如果尚未启动,请尝试创建一个新进程,然后执行exec()命令,例如“schtasks/run/tn“您的任务名称”“

我认为这涵盖了您提到的所有基础,然后再涵盖一些。以上所有内容都应该非常简单。如果您确实确定这可能是您要采用的路线,或者我忽略了某些内容,或者您​​有其他条件进一步限制了您的选择,请再次告知我们。

关于java - 我希望我的服务在不提升的情况下运行,但作为恰好是管理员的用户(Windows/UAC),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6430721/

相关文章:

java - 将一个值转换为两个类

java - Java中如何将泛型类型转换为具体类型

c++ - Windows WiFi 网络设备

windows - 用于检查系统服务是否正在运行的批处理文件

java - Android: api 16 将矩形的轮廓绘制为填充的矩形

java - jfreechart:如何排列两个图?

Windows 程序集堆和堆栈?

linux - 如何直接从Linux hadoop edge节点自动复制文件到windows共享盘?

android - 使用 onClickListener 在 Service 中停止服务

android - 多次启动服务会在onStartCommand()中嵌套调用吗?