参考URL:

https://blog.csdn.net/u011801161/article/details/45567289

http://blog.nsfocus.net/analysis-windows-access-authority-inspection-mechanism/

https://blog.csdn.net/eggfly178/article/details/41773601

一 Windows访问控制概述:

Windows访问控制中最主要的部分:访问令牌(Access Token)和安全描述符(Security Descriptor),window通过查看访问者AT与被访问对象SD中的内容来确定访问者是否能访问对象。

Windows访问控制概念介绍: 
① SID:Secure Identifier(安全标识符),每个用户和账户组都有一个唯一的SID(通常情况下唯一)。它是标识用户、用户组和计算机账户唯一的号码,由计算机名、当前时间、当前用户态线程的CPU耗费时间三个参数来确定。 
② Access Token:与特定的windows账户关联,账户环境下启动的所有进程都会获得该令牌的副本,进程中的线程默认获得这个令牌。由关联账户的SID、当前登录账户所属组的SID列表、受限制的SID列表、当前登录账户与所属组的Privilege列表组成。 
③ Security Descriptor:安全描述符,与被访问对象关联。由对象所有者的SID、属组SID、DACL、SACL组成。DACL(随机访问控制列表)是SD最重要的一部分,描述允许或拒绝特定用户或组的某些访问权限,它包含零个或多个访问控制实体(ACE,Access Control Entry)。 
④ ACE:访问控制实体,用于指定特定用户/组的访问权限,由SID、SIZE、Type、Access Mask、Inheritance/Audit Flags组成。

Windows访问控制流程图: 
当一个线程尝试去访问一个对象时,系统会检查线程持有的令牌以及被访问对象的安全描述符中的DACL。 
如果安全描述符中不存在DACL,则系统会允许线程进行访问。如果存在DACL,系统会顺序遍历DACL中的每个ACE,检查ACE中的SID在线程的令牌中是否存在。以访问者中的User SID或Group SID作为关键字查询被访问对象中的DACL。顺序:先查询类型为DENY的ACE,若命中且权限符合则访问拒绝;未命中再在ALLOWED类型的ACE中查询,若命中且类型符合则可以访问;以上两步后还没命中那么访问拒绝。 

此外, SACL是系统访问控制列表,是用来做审计用的,一般不用关心。

二 一个修改特定对象DACL

  以下代码实现了以默认权限创建一个event内核对象(默认权限下Administrators组没有修改权限), 然后给该对象的Administrators组添加修改权限的功能. 注意: 以下代码必须在system权限下运行(就是服务进程里边), 只展示了核心代码部分, DACL的修改貌似只能以整个安全描述符为单位进行修改, 不知道是不是我孤陋寡闻的原因

 #include <windows.h>
#include <aclapi.h>
#include <sddl.h>
bool MyCreateEvent()
{
HANDLE g_HEStop =NULL;
bool result = false;
DWORD ret = ;
PACL pDACL11 = NULL;
PSECURITY_DESCRIPTOR pSE = NULL;
PSID pAdminSID = NULL;
wchar_t *domainName = NULL;
do
{
//get sid
LogToFile(L"find administrators sid");
DWORD domainSize = ;
DWORD sidSize = ;
SID_NAME_USE sidType = SidTypeGroup;
ret = LookupAccountNameW(NULL, L"Administrators", NULL, &sidSize, NULL, &domainSize, &sidType);
if (!(ret == && GetLastError() ==ERROR_INSUFFICIENT_BUFFER))
{ LogErr(L"LookupAccountName err1", GetLastError());
break;
}
std::wstring str = std::to_wstring(sidSize);
str += L" ";
str += std::to_wstring(domainSize);
LogToFile(str.c_str()); pAdminSID = new char[sidSize];
domainName = new wchar_t[domainSize];
if (!pAdminSID || !domainName)
{
LogToFile(L"alloc buffer err");
break;
} ret = LookupAccountNameW(NULL, L"Administrators", pAdminSID, &sidSize, domainName, &domainSize, &sidType);
if (ret == )
{
LogErr(L"LookupAccountName err2", GetLastError());
break;
}
else
{
LogErr(L"sidType", sidType);
LPWSTR str = NULL;
if (ConvertSidToStringSidW(pAdminSID, &str))
{
LogToFile(str);
LocalFree(str);
str = NULL;
}
} // create event
LogToFile(L"create event");
g_HEStop = CreateEventW(NULL, TRUE, FALSE, STOP_EVENT_NAME);
if (!g_HEStop)
{
LogToFile(L"create event err");
break;
} // modify dacl
LogToFile(L"modify dacl");
ret = GetSecurityInfo(g_HEStop, SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, &pDACL11, NULL, &pSE);
if (ret != ERROR_SUCCESS)
{
LogErr(L"get Dacl err",ret);
break;
} ACL_SIZE_INFORMATION aclSInfo;
ret = GetAclInformation(pDACL11, &aclSInfo, sizeof(ACL_SIZE_INFORMATION), AclSizeInformation);
if (ret == )
{
LogErr(L"get acl info err", GetLastError());
break;
} LogToFile(L"enum ace"); PACE_HEADER aceHeader = NULL;
bool find = false;
PSID pSidInAce = NULL;
LPWSTR StringSid = NULL;
for (DWORD index = ; index < aclSInfo.AceCount; ++index)
{
ret = GetAce(pDACL11, index, (LPVOID*)&aceHeader);
if (ret)
{
// 目前来说各中ace的结构是一样的, 可以这么写, 将来可能会变
pSidInAce = (PSID)((DWORD)aceHeader + sizeof(ACE_HEADER) + sizeof(ACCESS_MASK));
if (ConvertSidToStringSidW(pSidInAce, &StringSid))
{
LogToFile(StringSid);
LocalFree(StringSid);
StringSid = NULL;
}
else
LogErr(L"ConvertSidToStringSidW err: ", GetLastError()); if (aceHeader->AceType == ACCESS_ALLOWED_ACE_TYPE)
{
PACCESS_ALLOWED_ACE aceAl = (PACCESS_ALLOWED_ACE)aceHeader;
if (EqualSid(pSidInAce, pAdminSID))
{
aceAl->Mask |= GENERIC_WRITE;
find = true;
break;
}
}
}
}
if (find)
{
ret = SetSecurityInfo(g_HEStop, SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, pDACL11, NULL);
if (ret == ERROR_SUCCESS)
result = true;
else
LogErr(L"SetSecurityInfo err: ", ret);
}
else
LogToFile(L"not find allow ace");
} while (false);
if (pAdminSID)
delete[] pAdminSID;
if (domainName)
delete[] domainName;
if (pSE)
LocalFree(pSE); if (!result && IsStopEventValid())
CloseHandle(g_HEStop);
return result;
}

Windows下访问控制管理的更多相关文章

  1. windows下python管理右键菜单

    实现很简单,不记得什么时候写的了,贴出来希望能有所价值 """ Windows中创建右键菜单 """ import os import sy ...

  2. 分享Nginx在Windows下的管理命令(bat文件)

    话不多说,复制下面的内容,存成bat文件,放到nginx目录下. ====================================================@echo offrem 当前 ...

  3. windows下进程管理常用命令

    1.查看当前正在运行的进程 tasklist 注: /im 后为映像名称参数:/f  为强行终止,可以通过 taskkill /? 查看更多帮助 2.强制杀死映像名称为imagename的进程,映像名 ...

  4. windows下运行的linux服务器批量管理工具(带UI界面)

    产生背景: 由于做服务器运维方面的工作,需要一人对近千台LINUX服务器进行统一集中的管理,如同时批量对LINUX服务器执行相关的指令.同时批量对LINUX服务器upload程序包.同时批量对LINU ...

  5. Windows下安装Cygwin及包管理器apt-cyg(转)

    本文为转载文章: http://www.2cto.com/os/201212/176551.html Cygwin可以在Windows下使用unix环境Bash和各种功能强大的工具,对于Linux管理 ...

  6. 【亲测可用,亦可配置同一平台的不同账号,例如阿里云的两个不同账号】Windows下Git多账号配置,同一电脑多个ssh-key的管理

    Windows下Git多账号配置,同一电脑多个ssh-key的管理   这一篇文章是对上一篇文章<Git-TortoiseGit完整配置流程>的拓展,所以需要对上一篇文章有所了解,当然直接 ...

  7. windows 下node版管理

    linux 下的node 多版本管理有nvm,windows 下同样有这样的工具gnvm 安装步骤(无node环境): 1.下载并解压缩 gnvm.exe 保存到任意文件夹,并将此文件夹加入到环境变量 ...

  8. windows下安装php依赖关系管理工具composer

    1.安装Composer Composer是PHP的依赖管理工具之一,官方网站 http://getcomposer.org/ .它支持多种安装方式,对于在win下做开发的草来说,最便捷的方式就是下载 ...

  9. [源码管理] Windows下搭建SVN服务器

    前文所述SVN客户端使用的时候,用的SVN服务器通常为外部,例如Google Code的服务器,不过,做为一个程序开发人员,就算自己一个人写程序,也应该有一个SVN版本控制系统,以便对开发代码进行有效 ...

随机推荐

  1. javamail发邮件

    使用JavaMail发送一封简单邮件的步骤:(1)创建代表邮件服务器的网络连接信息的Session对象.(2)创建代表邮件内容的Message对象(3)创建Transport对象.连接服务器.发送Me ...

  2. md5Util

    package com.rscode.credits.util; /** * MD5加密类 * @author 12 */ import java.security.MessageDigest; pu ...

  3. svg 图片

    https://studio.qcloud.coding.net/rs2/d67e3c26b502365f8ab7c05d71c70471.svg 腾讯编辑器loading页面的svg

  4. webservice接口和http接口介绍---更新版

    web service(SOAP)与HTTP接口的区别什么是web service? soap请求是HTTP POST的一个专用版本,遵循一种特殊的xml消息格式Content-type设置为: te ...

  5. ionic2简单分析

    Angular2是一个全新的框架,它从ReactJS以及其他web移动框架借鉴了不少经验和优点,巨大的改进使得开 发体验和性能已经超越了Angular1,而且Ionic2无论是从UI交互效果和跨平台的 ...

  6. CrawlSpider模板

    crawlSpider 创建CrawlSpider模板 scrapy genspider -t crawl <爬虫名字> <域名> 模板代码示例: # -*- coding: ...

  7. js中日期格式与时间戳格式互换

    2014-04-23 18:55:49:123    日期格式 1398250549123        时间戳格式 前台显示日期格式,则 function tsToTime(ts) { var da ...

  8. sublime An unhandled OS error was encountered nodejspath_error

    sublime An unhandled OS error was encountered  nodejspath_error 点击ok,修改node_path typescript 插件下载 ctr ...

  9. Web前端学习第一天

    1.SQL注入攻击的发生 select username, email ,descl from users where id=1; 可能会被伪造成 1 union select password,1, ...

  10. css里px em rem特点(转)

    1.px特点: 1.IE无法调整px作为单位的字体大小: 2.Firefox能够调整px.em和rem. px是像素,是相对长度单位,是相对于显示器屏幕分辨率而言的. 2.em特点: 1.em的值并不 ...