前面也提到了,前段时间在做Online Judge系统,在正式上线前有几个比较老的版本,其中第一个版本使用ACL来控制权限以确保安全(但是这个版本完全建立在IIS上,所以这样做是没效果的),遇到了一些问题,至于问题是什么以后有机会再说,那么解决这些问题曾想到一个办法,更改文件的所有者。

在搜索引擎里搜索“C# 修改文件所有者”都会搜索到很多类似《c# 更改文件访问权限 所有者(适用于win7以下版本) 》,但是就没出现过《c# 更改文件访问权限 所有者(适用于各个Windows版本) 》。为什么要特意强调适用于win7以下版本,是因为

FileInfo fi = new FileInfo(@"d:\囧.txt");
FileSecurity fs = fi.GetAccessControl();
NTAccount currentAccount = (NTAccount)fs.GetOwner(typeof(NTAccount));
Console.WriteLine("先前的所有者为 " + currentAccount.Value);
NTAccount admins = new NTAccount("administrators");//注意 这里是administrators 而不是administrator 他表示管理员组而非一个单个的帐号
fs.SetOwner(admins);
fi.SetAccessControl(fs);
Console.WriteLine("当前的所有者为 " + fi.GetAccessControl().GetOwner(typeof(NTAccount)).Value);

这样做会在Windows 7以及更高版本上go die(不允许将安全标识符作为此对象的所有者),高版本Windows需要用Win32API,如果手工去操作会复杂很多。偶然在StackOverflow上找到一篇文章说到了一个解决方案,由于年代久远不可考(其实是懒当时没记忘了)所以就不贴原文了。

爆栈网上的答主给的方法是使用一个外部库,这个库看名字就知道是干什么的,用起来也特别方便:

贴段老代码(应该是这么用的,这个版本还能跑起来):

File.Copy(outfileName, tempfileName);
var everyone = new SecurityIdentifier(WellKnownSidType.WorldSid, null);
var domain = new FileInfo(outfileName).GetAccessControl().GetOwner(typeof(NTAccount)).Value.Split('\\')[0];
var user = new FileInfo(outfileName).GetAccessControl().GetOwner(typeof(NTAccount)).Value.Split('\\')[1];
var ediFileOwner = new NTAccount(domain, user);
var fileSecurity = File.GetAccessControl(outfileName);
File.SetAccessControl(outfileName, fileSecurity);
File.Delete(outfileName);
File.Move(tempfileName, outfileName);
var aosSID = (SecurityIdentifier)ediFileOwner.Translate(typeof(SecurityIdentifier));
File.SetAccessControl(outfileName, fileSecurity);
using (new Impersonator(/*UserName*/, domain, /*UserPassword*/))
{
fileSecurity = File.GetAccessControl(outfileName);
fileSecurity.SetOwner(ediFileOwner);
File.SetAccessControl(outfileName, fileSecurity);
}

在注释处填写要更改为的所有者的账户名和密码。虽然看起来很复杂的样子,其实过程非常简单:创建源文件的副本,获得它的信息,干掉源文件,改名副本然后调用Impersonator来设置所有者。

使用前,这个锅是杨某的:

执行后,这个锅就甩了:

C#更改文件访问权限所有者(适用于各个Windows版本)的更多相关文章

  1. 文件访问权限:更改用户ID

    本文来探讨一下通过更改用户ID来获取合适的文件访问权限.由于更改组ID的规则与用户ID相同,我们在这里只探讨用户ID. 纸上得来终觉浅 先了解以下几个基本知识: 用户ID包括:实际用户ID.有效用户I ...

  2. UNIX环境编程学习笔记(9)——文件I/O之文件访问权限的屏蔽和更改

    lienhua342014-09-10 1 文件访问权限 在文件访问权限和进程访问控制中,我们已经讲述过文件访问权限位,为了方便,我们重新列在下面, 表 1: 文件的 9 个访问权限位  st_mod ...

  3. [apue] linux 文件访问权限那些事儿

    前言 说到 linux 上的文件权限,其实我们在说两个实体,一是文件,二是进程.一个进程能不能访问一个文件,其实由三部分内容决定: 文件的所有者.所在的组: 文件对所有者.组用户.其它用户设置的权限访 ...

  4. ubuntu chmod 无法更改 文件夹权限 系统提示“不允许的操作 2、linux 如何修改只读文件 3、ubuntu安装

    1.ubuntu chmod 无法更改 文件夹权限 系统提示“不允许的操作 答案:需要超级用户权限 sudo 2.linux 如何修改只读文件 答案:可以使用chmod命令,为改文件提供其他的权限.u ...

  5. Linux下进程的文件访问权限

    本文转自 http://blog.csdn.net/chosen0ne/article/details/10581883 对进程校验文件访问权限包括两个部分,一是确定进程的角色(属于哪个用户或者组), ...

  6. 《UNIX环境高级编程》笔记--文件访问权限和新文件、目录所有权

    1.与进程关联的用户ID和组ID 与一个进程关联的ID有一下几个: 实际用户ID和实际组ID标识我们究竟是谁.通常在一个会话间值是不会改变的,但是超级用户进程有方法改变 他们,在以后的进程控制中会进行 ...

  7. linux文件访问权限(像rw-r--rw-是什么意思)

    Linux的文件访问权限分为 读.写.执行三种 r:可读(4) w:可写(2)对目录来说则可新建文件 x:可执行(1)对目录来说则可进入该目录 可用 ls -l 查看文件 像上图的-rw-r--rw- ...

  8. 用户id,组id和文件访问权限

    实际用户ID和实际组ID:标示了我们究竟是谁,这两个字段在登录时取自口令文件中的登录项 有效用户ID和有效组ID以及附属组ID:决定了我们的文件的访问权限(通常有效用户ID等于实际用户ID,有效组ID ...

  9. Linux中ls -l(ll)返回结果中的文件访问权限-rw-r--rw-

    linux文件访问权限(像rw-r--rw-是什么意思)   Linux的文件访问权限分为 读.写.执行三种 r:可读(4) w:可写(2)对目录来说则可新建文件 x:可执行(1)对目录来说则可进入该 ...

随机推荐

  1. redirect和forward

    1.重定向 <mvc:view-controller path="/" view-name="redirect:/admin/index"/>即如果 ...

  2. 【笔记】android sdk集成的eclipse中导入项目

    android sdk集成的eclipse中导入项目 想要把旧的ADT项目,一模一样的导入进来,需要: 1.把项目放到,非当前ADT的workspace目录下: 2.从Project中Import,选 ...

  3. 腾讯OAuth授权联合登录

    /** * unionLoginCallbackPath */ @Value("${QQ_UNION_LOGIN_CALLBACK_PATH}") private String q ...

  4. Sprint 3 回顾与总结 和团队贡献分 以及Sprint 1、2、3 总概

    团队情况: 团队名称:Heaven Fire 团队博客地址:https://home.cnblogs.com/u/gjpg/                         团队Github地址:ht ...

  5. Windows结构化异常

    不错的总结: http://hi.baidu.com/wangxvfeng101/item/518f6efdab4e5616ff35820e http://www.vckbase.com/index. ...

  6. Windows XP发行12周年,我正步入中年,你已垂暮

    2001年10月25日,Windows XP正式全球上市!作为Windows 2000的升级版本,XP拥有大量新的功能:新的用户界面.防火墙整合等,这些都大大的增强了系统的易用性和安全性.而微软将于2 ...

  7. C# 模拟上传图片

    上传图片的格式一定要按规定的写,不然没办法正确上传的. 我在上传的时候就是值前面没有空一行,导致上传不成功,很纠结的错误. 我要模拟的是一个FLASH的上传控件,我开始用HttpAnalyze抓包是抓 ...

  8. Http请求中Content-Type讲解以及在Spring MVC中的应用

    引言: 在Http请求中,我们每天都在使用Content-type来指定不同格式的请求信息,但是却很少有人去全面了解content-type中允许的值有多少,这里将讲解Content-Type的可用值 ...

  9. hdoj 2034 人见人爱A-B

    Problem Description 参加过上个月月赛的同学一定还记得其中的一个最简单的题目,就是{A}+{B},那个题目求的是两个集合的并集,今天我们这个A-B求的是两个集合的差,就是做集合的减法 ...

  10. js 根据名字获取cookie 的方法

    function getcookie(c_name) { if (document.cookie.length > 0) { c_start = document.cookie.indexOf( ...