C#更改文件访问权限所有者(适用于各个Windows版本)
前面也提到了,前段时间在做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版本)的更多相关文章
- 文件访问权限:更改用户ID
本文来探讨一下通过更改用户ID来获取合适的文件访问权限.由于更改组ID的规则与用户ID相同,我们在这里只探讨用户ID. 纸上得来终觉浅 先了解以下几个基本知识: 用户ID包括:实际用户ID.有效用户I ...
- UNIX环境编程学习笔记(9)——文件I/O之文件访问权限的屏蔽和更改
lienhua342014-09-10 1 文件访问权限 在文件访问权限和进程访问控制中,我们已经讲述过文件访问权限位,为了方便,我们重新列在下面, 表 1: 文件的 9 个访问权限位 st_mod ...
- [apue] linux 文件访问权限那些事儿
前言 说到 linux 上的文件权限,其实我们在说两个实体,一是文件,二是进程.一个进程能不能访问一个文件,其实由三部分内容决定: 文件的所有者.所在的组: 文件对所有者.组用户.其它用户设置的权限访 ...
- ubuntu chmod 无法更改 文件夹权限 系统提示“不允许的操作 2、linux 如何修改只读文件 3、ubuntu安装
1.ubuntu chmod 无法更改 文件夹权限 系统提示“不允许的操作 答案:需要超级用户权限 sudo 2.linux 如何修改只读文件 答案:可以使用chmod命令,为改文件提供其他的权限.u ...
- Linux下进程的文件访问权限
本文转自 http://blog.csdn.net/chosen0ne/article/details/10581883 对进程校验文件访问权限包括两个部分,一是确定进程的角色(属于哪个用户或者组), ...
- 《UNIX环境高级编程》笔记--文件访问权限和新文件、目录所有权
1.与进程关联的用户ID和组ID 与一个进程关联的ID有一下几个: 实际用户ID和实际组ID标识我们究竟是谁.通常在一个会话间值是不会改变的,但是超级用户进程有方法改变 他们,在以后的进程控制中会进行 ...
- linux文件访问权限(像rw-r--rw-是什么意思)
Linux的文件访问权限分为 读.写.执行三种 r:可读(4) w:可写(2)对目录来说则可新建文件 x:可执行(1)对目录来说则可进入该目录 可用 ls -l 查看文件 像上图的-rw-r--rw- ...
- 用户id,组id和文件访问权限
实际用户ID和实际组ID:标示了我们究竟是谁,这两个字段在登录时取自口令文件中的登录项 有效用户ID和有效组ID以及附属组ID:决定了我们的文件的访问权限(通常有效用户ID等于实际用户ID,有效组ID ...
- Linux中ls -l(ll)返回结果中的文件访问权限-rw-r--rw-
linux文件访问权限(像rw-r--rw-是什么意思) Linux的文件访问权限分为 读.写.执行三种 r:可读(4) w:可写(2)对目录来说则可新建文件 x:可执行(1)对目录来说则可进入该 ...
随机推荐
- CentOS 7下安装Mysql 5.7
参见http://www.07net01.com/2016/03/1355735.html 过程中需要安装perl CentOS 7 采用了 firewalld 防火墙 service firewal ...
- C#图片压缩处理算法
原文链接:http://blog.csdn.net/szstephenzhou/article/details/38900345
- mb_系列函数和普通字符函数的区别
<?php //phpinfo(); $str = 'abcdef'; echo strlen($str);// 6 echo '<br/>'; echo substr($str, ...
- 解决jquery-ui-autocomplete选择列表被Bootstrap模态窗遮挡的问题
最近在一个ASP.NET MVC5项目中使用Bootstrap的模态窗(弹出层)来让用户填写内容,其中的一个编辑框提供了自动完成功能,用jQuery UI Autocomplete来实现. 因为我是W ...
- ADV数字的剪切
#include <iostream> using namespace std; #define SIZE 9 #define MAXLEN 6 int data[SIZE][MAXLEN ...
- 结合阿里云服务器,设置家中jetson tk1随时远程登陆
前提条件: 1.路由配置dmz主机为tk1的ip ,设置路由器中ssh 端口22的访问权限 2.有一台远程服务器,服务器安装了php可以运行php文件(我使用的是阿里云) 家中tk1配置: 脚本pyt ...
- 实验 2 用C语言编写简单程序
#include<stdio.h> int main() { int x,y; printf("enter x:"); scanf("%d",&am ...
- python中文编码
前面章节中我们已经学会了如何用 Python 输出 "Hello, World!",英文没有问题,但是如果你输出中文字符"你好,世界"就有可能会碰到中文编码问题 ...
- 多进程模块multiprocessing的使用
该模块提供如下功能: 建立并管理运行指定函数的子进程 基本接口: 1 Process(group, target, name, args[, kwargs]): 初始化子进程对象 2 p.daemon ...
- javascript中常用操作字符串的几种方法charAt()、indexOf()、slice()、substr()
一.charAt(index) 返回一个字符串某一个索引的字符. 语法:str.charAt(index); var str='我是中国人'; console.log(str.charAt(3));/ ...