c# - 如何以编程方式授予虚拟用户对文件夹(或文件)的权限

我有一个我写的服务,我需要部署到一些(大约 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/

相关文章:

rust - 我如何使字符串比闭包体生命周期更长?

node.js - 如何在 Strapi 中创建不同的管理员角色

android - 使用 Moshi 处理错误响应

javascript - 为什么 useState 不在单元测试(Jest、Enzyme)中重新渲染

flutter - 无法在 flutter 中使用wifi包连接到wifi

reactjs - 应用多个动态过滤器

javascript - 为什么外部 javascript 文件不工作 Rails 6?

python - 实现函数的优化和非优化版本的最简洁方法?

angular-cli - 每当我运行 npm run ng build-hin 时,我都会遇到错误

python - CondaEnvException : Pip failed. 尝试使用 .yml