无法将完全控制添加到设置文件
Can't Add Full Control to Settings File
我有一个 C# 应用程序,它将其设置存储在 ProgramData 子文件夹中,例如
C:\ProgramData\Manufacturer\Product\Version\Settings.xml
我注意到应用程序无法保存设置更改,出现 权限被拒绝错误。我的解决方法是手动更改安全设置并让 Everyone 完全控制文件夹树和文件。这行得通,但我想要一种更强大的方法。
根据 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);
}
}
当我单步执行代码时,我得到
Attempted to perform an unauthorized operation exception
当我执行这条语句时:
fi.SetAccessControl(fs);
如果我关闭 Visual Studio 2015 并以管理员身份打开它,那么我的代码将正确执行并且文件安全性现在有一个完全控制的 Everyone 条目。
最后,问题来了:
我遵循将上述代码放入我的应用程序的建议,然后在安装项目中,我使用 Install
命令行选项向 运行 新安装的应用程序添加自定义操作.我的应用程序,如果它看到 "Install" 参数,将 运行 上面的代码。由于我使用的是默认为所有用户安装的安装项目,它会在安装前自动给出管理员提示。这是否意味着整个会话,包括安装后对 运行 应用程序的特殊操作,都 运行 在管理员权限下?
如果是这样,这应该可行,对吧?
但是如果安装者将其更改为 "This user" 那么它将不是 运行 管理员权限,并且我的代码将失败。如果需要,我总是可以做最后的安装,因此总是使用管理员提示,但我不想依赖它。
有没有更合适的方法来做到这一点?
谢谢...
您的程序似乎没有 运行ning 提升,因此无法更新该位置的文件,我假设您希望您的用户不需要管理员权限,您可以使用提升清单在你的程序。
那么为什么选择那个位置来存储数据呢?为什么不直接使用用户的应用程序数据文件夹?
至于该代码,将其添加为安装程序 class 自定义操作而不是 运行 可执行文件可能更可靠。在 运行s 提升的 Everyone 安装中,代码将 运行 具有本地系统帐户的特权。
我有一个 C# 应用程序,它将其设置存储在 ProgramData 子文件夹中,例如
C:\ProgramData\Manufacturer\Product\Version\Settings.xml
我注意到应用程序无法保存设置更改,出现 权限被拒绝错误。我的解决方法是手动更改安全设置并让 Everyone 完全控制文件夹树和文件。这行得通,但我想要一种更强大的方法。
根据 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);
}
}
当我单步执行代码时,我得到
Attempted to perform an unauthorized operation exception
当我执行这条语句时:
fi.SetAccessControl(fs);
如果我关闭 Visual Studio 2015 并以管理员身份打开它,那么我的代码将正确执行并且文件安全性现在有一个完全控制的 Everyone 条目。
最后,问题来了:
我遵循将上述代码放入我的应用程序的建议,然后在安装项目中,我使用 Install
命令行选项向 运行 新安装的应用程序添加自定义操作.我的应用程序,如果它看到 "Install" 参数,将 运行 上面的代码。由于我使用的是默认为所有用户安装的安装项目,它会在安装前自动给出管理员提示。这是否意味着整个会话,包括安装后对 运行 应用程序的特殊操作,都 运行 在管理员权限下?
如果是这样,这应该可行,对吧?
但是如果安装者将其更改为 "This user" 那么它将不是 运行 管理员权限,并且我的代码将失败。如果需要,我总是可以做最后的安装,因此总是使用管理员提示,但我不想依赖它。
有没有更合适的方法来做到这一点?
谢谢...
您的程序似乎没有 运行ning 提升,因此无法更新该位置的文件,我假设您希望您的用户不需要管理员权限,您可以使用提升清单在你的程序。
那么为什么选择那个位置来存储数据呢?为什么不直接使用用户的应用程序数据文件夹?
至于该代码,将其添加为安装程序 class 自定义操作而不是 运行 可执行文件可能更可靠。在 运行s 提升的 Everyone 安装中,代码将 运行 具有本地系统帐户的特权。