前面也提到了,前段时间在做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. 使用angularJS遇见的一些问题的解决方案

    1. angularJS的$http.post请求,SpringMVC后台接收不到参数值的解决方案 问题一般为:400 Required String parameter 'rPassword' is ...

  2. 在linux中添加ftp用户,并设置相应的权限

    在linux中添加ftp用户,并设置相应的权限,操作步骤如下: 1.环境:ftp为vsftp.被限制用户名为test.被限制路径为/home/test 2.建用户:在root用户下: useradd ...

  3. Getting Started With Hazelcast 读书笔记(第一章)

    第一章:数据集群的演化与 早期的服务器架构 显然,应用是可扩展的,但是由于是集中式服务器,随着数据库性能达到极限,再想扩展就变得极端困难,于是出现了缓存.    缓存显然再次提升了可扩展性,减轻了数据 ...

  4. 大前端学习笔记整理【五】关于JavaScript中的关键字——this

    写在前面 工作有那么一段时间了,但是在工作中,发现自己的理论知识还是有所欠缺.特别是在javascript上,很多东西其实自己属于知道要用这个,但是不知道为什么要这么用...这种情况很是尴尬了,所以写 ...

  5. 一般多项式曲线的最小二乘回归(Linear Regression)

    对于一般多项式: K为多项式最高项次,a为不确定的常数项,共k+1个; 有离散数据集对应,其方差: β为,方差函数S对β自变量第j个参数的梯度(偏导数): 当以上梯度为零时,S函数值最小,即: 中的每 ...

  6. Being a Good Boy in Spring Festival 尼姆博弈

    Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Descr ...

  7. 移动端前端笔记 — 遇到的常见JS与CSS问题及解决方法 ( 摘自zdwzdwzdw)

    笔者接触移动前端快一年了,特将平时的一些笔记整理出来,希望能够给需要的人一些小小的帮助.同时也由于笔者的水平有限,虽说都是笔者遇到过使用过的,但文中可能也会出现一些问题或不严谨的地方,望各位指出,不胜 ...

  8. ios6 滤镜相关知识内容网址

    http://blog.csdn.net/justinjing0612/article/details/8145607#

  9. Enterprise app deployment on iOS 7.1 by github

    在iOS7.1以上版本通过Url分发企业应用时,需要采用SSL方式分发plist.如果采用http方式,就会报“无法安装应用程序,因为"example.com"的证书无效.”正确的 ...

  10. LInux配置jdk(mac和windows)

    我的linux使用的是VMware搭建的虚拟环境,用的是CENTOS6.5 一.准备工作: 1.确定系统安装的是成功的. 2.系统没有其他的问题 3.确定没有安装过其他版本的jdk,两个jdk会反冲 ...