我有一个我写的服务,我需要部署到一些(大约 1100 台)设备上。所有这些设备都以普通用户而非管理员身份登录。
我可以使用我们的部署软件推出服务,该软件确实以管理员身份运行。我们的安全团队不希望此服务在本地系统帐户上运行(出于显而易见的原因)。我想到的是该服务将安装为本地系统,但随后会将其登录帐户更改为虚拟用户,然后需要访问程序中的文件夹文件 (x86)
。
我发现如果我通过命令行安装该服务(使用远程管理员访问),我可以安装该服务,但它不会启动强>.
当我查看事件日志时,我得到一个 UnauthorizedAccessException
错误。
我怀疑这是因为该服务已经在无权启动服务的虚拟用户下运行。那么我该如何解决这个问题呢?
在服务的主类中,我有这个方法,它应该允许用户访问必要的文件夹:
private void GiveDirectoryAccess(string dir, string user)
{
try
{
DirectoryInfo directoryInfo = new DirectoryInfo(dir);
DirectorySecurity ds = directoryInfo.GetAccessControl();
ds.AddAccessRule(new FileSystemAccessRule(user, FileSystemRights.FullControl,
InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, PropagationFlags.NoPropagateInherit, AccessControlType.Allow));
directoryInfo.SetAccessControl(ds);
}
catch (Exception e)
{
SimpleLog.Log(e);
throw;
}
}
服务初始化后立即调用:
public CheckRALVersionService()
{
InitializeComponent();
// Give directory access
string alhadminPath = System.IO.Path.Combine(pathToFolder, alhadmin);
GiveDirectoryAccess(alhadminPath, serviceUser);
string exeName = System.IO.Path.GetFileName(fullExeNameAndPath);
string tmppath = System.IO.Path.Combine(localdir, tmp);
SimpleLog.SetLogFile(logDir: tmppath, prefix: "debout." + exeName + "_", extension: "log");
watcher = new DirectoryWatcher(pathToFolder, alhadmin);
}
然后,在 ProjectInstaller
类中,我在 serviceInstaller1_Committed
方法中将用户更改为虚拟用户:
void serviceInstaller1_Committed(object sender, InstallEventArgs e)
{
using (ManagementObject service = new ManagementObject(new ManagementPath("Win32_Service.Name='RalConfigUpdate'")))
{
object[] wmiParams = new object[11];
wmiParams[6] = @"NT Service\RalConfigUpdate";
service.InvokeMethod("Change", wmiParams);
}
}
我需要帮助服务来授予访问权限吗?我想做的事情都可以在这个服务中完成吗?
提前致谢。
最佳答案
一种选择是授予普通用户启动和停止服务的权限。 Microsoft 有一个用于该目的的小工具:SubInAcl !
Set Windows Service Permission !
应该也可以使用组策略来做到这一点。对于您的用例,这应该是更好的方法。另一方面,SubInAcl 方法更容易为您测试。我找到了一个较旧的描述 here !
https://stackoverflow.com/questions/62562930/