我有一个工作正常的自定义安装程序,但每次更新应用程序时都要求用户获得管理员权限。我正在创建一个跳过此部分的Windows服务,但Windows服务仅向该文件授予系统和管理员权限,并且用户无法执行新的更新。
要纠正这个我正在尝试(在文件下载/安装到正确的位置之后(从Windows服务中,它有帐户ServiceAccount.LocalSystem),
FileSecurity access = file.GetAccessControl();
SecurityIdentifier everyone = new SecurityIdentifier(WellKnownSidType.WorldSid, null);
access.AddAccessRule(new FileSystemAccessRule(everyone, FileSystemRights.ReadAndExecute, AccessControlType.Allow));
但设置无效。我该怎么办?
答案 0 :(得分:4)
我明白了。我只需要打电话,
file.SetAccessControl(access);
以上之后。显然,file.GetAccessControl会传回访问控制的副本,而不是控制文件文件权限的副本,直到您使用修改后的权限调用file.SetAccessControl。
我在另一个文件中发现了另一个警告,该服务是在c:\ ProgramData中创建的,
答案 1 :(得分:3)
我最近在从网络加载文件时遇到了问题,并希望能够在测试中重新创建错误并遇到同样的问题。
我提出了以下小课程来帮助它,因为用于完成这些工作的API非常糟糕且充满了一点陷阱:
public class PermissionController
{
private readonly string _file;
private readonly FileSecurity _accessControl;
private readonly SecurityIdentifier _id;
private readonly List<FileSystemAccessRule> _permissionsDenied;
public PermissionController(string file)
{
_file = file;
_accessControl = File.GetAccessControl(_file);
_id = WindowsIdentity.GetCurrent().Owner;
_permissionsDenied = new List<FileSystemAccessRule>();
}
public void Allow(params FileSystemRights[] rights)
{
foreach (var right in rights)
AddRule(Rule(right, AccessControlType.Allow));
}
public void Deny(params FileSystemRights[] rights)
{
foreach (var right in rights)
{
var rule = Rule(right, AccessControlType.Deny);
AddRule(rule);
_permissionsDenied.Add(rule);
}
}
private void AddRule(FileSystemAccessRule rule)
{
_accessControl.AddAccessRule(rule);
}
private FileSystemAccessRule Rule(FileSystemRights right, AccessControlType type)
{
return new FileSystemAccessRule(_id, right, type);
}
public void RemoveDeniedPermissions()
{
foreach (var rule in _permissionsDenied)
_accessControl.RemoveAccessRule(rule);
Apply();
}
public void Apply()
{
File.SetAccessControl(_file,_accessControl);
}
}
调用代码如下:
_permissionController = new PermissionController(_file);
_permissionController.Allow(FileSystemRights.Read, FileSystemRights.Write);
_permissionController.Deny(FileSystemRights.FullControl,
FileSystemRights.Modify,
FileSystemRights.ReadAndExecute);
_permissionController.Apply();
其中_file是完全限定的路径。
你需要小心打电话
添加/删除规则后的File.SetAccessControl,否则无效。
除非我误解了API,否则您必须为每个权限添加一条规则,因为FileSystemRights枚举不使用标记。
您还需要小心谨慎,因为允许您拒绝的权利并不等同于删除拒绝该权利的规则。似乎被拒绝的权利超越了允许的权利。
您可以通过查看Windows资源管理器中文件属性的安全选项卡来观察结果。