我有一个C#应用程序,它将其设置存储在ProgramData子文件夹中,如
C:ProgramDataManufacturerProductVersionSettings.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并以管理员身份打开它,那么我的代码将正确执行,并且文件安全性现在有了一个Everyone的条目,可以完全控制它。
最后,问题来了:
我建议将上面的代码放在我的应用程序中,然后在安装项目中添加一个自定义操作,用Install
命令行选项运行新安装的应用程序。如果我的应用程序看到"Install"参数,它将运行上面的代码。由于我使用的是默认情况下为所有用户安装的安装项目,因此它会在安装前自动向管理员发出提示。这是否意味着整个会话,包括安装后运行应用程序的特殊操作,都是在管理员权限下运行的?
如果是这样,这应该有效,对吧?
但是,如果安装人员将其更改为"This user",那么它将不会以管理员权限运行,我的代码将失败。如果需要的话,我总是可以做最后的安装,因此总是使用管理员提示,但我不喜欢依赖它。
有更合适的方法吗?
谢谢。。。
您的程序似乎没有在提升运行,因此无法更新该位置的文件,我认为您希望用户不需要管理员权限,您可以在程序中使用提升清单添加该权限。
那么,为什么要选择那个位置来存储数据呢?为什么不直接使用用户的应用程序数据文件夹?
至于该代码,将其添加为安装程序类自定义操作可能比运行可执行文件更健壮。在提升运行的Everyone安装中,代码将以本地系统帐户的特权运行。