无法将完全控制权添加到设置文件

时间:2018-10-26 17:07:54

标签: c# setup-project visual-studio-setup-proje file-security

我有一个C#应用程序,将其设置存储在ProgramData子文件夹中,例如

C:\ProgramData\Manufacturer\Product\Version\Settings.xml

我注意到该应用程序无法保存设置更改,出现权限被拒绝错误。我的解决方法是手动更改安全设置,并让所有人完全控制文件夹树和文件。这行得通,但是我想要一个更可靠的方法。

使用SO的建议,我创建了以下代码:

private void set_permissions()
{
    try
    {
        // Create security idenifier for all users (WorldSid)
        SecurityIdentifier sid = new SecurityIdentifier(WellKnownSidType.WorldSid, null);

        // get file info and add write, modify permissions
        FileInfo fi = new FileInfo(settingsFile);
        FileSecurity fs = fi.GetAccessControl();
        FileSystemAccessRule fsar = 
            new FileSystemAccessRule(sid, FileSystemRights.FullControl, InheritanceFlags.None, PropagationFlags.None, AccessControlType.Allow);

        fs.AddAccessRule(fsar);
        fi.SetAccessControl(fs);
        LogIt.LogInfo("Set permissions on Settings file");
    }
    catch(Exception ex)
    {
        LogIt.LogError(ex.Message);
        MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

浏览代码时,我得到

  

试图执行未经授权的操作异常

当我执行以下语句时:

fi.SetAccessControl(fs);

如果我关闭Visual Studio 2015并以管理员身份打开它,那么我的代码将正确执行,并且文件安全性现在具有完全控制权限的所有人条目。

最后,问题来了:

我遵循将上述代码放入我的应用程序的建议,然后在安装项目中添加一个自定义操作,以使用Install命令行选项运行新安装的应用程序。我的应用程序,如果看到“ Install”参数,将运行上面的代码。由于我使用的是默认情况下为所有用户安装的安装项目,因此安装前会自动向管理员提示。这是否意味着整个会话(包括在安装后运行该应用程序的特殊操作)都在管理员权限下运行?

如果是这样,这应该起作用,对吗?

但是,如果安装人员将其更改为“此用户”,则它将无法以管理员权限运行,并且我的代码将失败。如果需要,我总是可以做最后安装的人,因此将始终使用管理员提示,但我讨厌依赖于此。

是否有更合适的方法来做到这一点?

谢谢...

1 个答案:

答案 0 :(得分:0)

您的程序似乎没有运行提升权限,因此无法更新该位置的文件,并且我假设您希望用户不需要管理员权限,而您可以使用程序中的海拔清单添加该权限。

那么为什么选择该位置存储数据?为什么不只使用User's Application Data文件夹?

对于该代码,将其添加为安装程序类自定义操作可能比运行可执行文件更健壮。在提升运行的Everyone安装中,代码将以本地系统帐户特权运行。