Nt/2000/xp平台下的存储控制模型(Access Control Model)
By 李智勇 2003-7-18 16:28
(二)
在涉及其他之前,我们先来看一段可能会出问题的程序。
if(ERROR_SUCCESS !=RegCreateKeyExW(HKEY_LOCAL_MACHINE,L"Software//007h",0,NULL,
REG_OPTION_NON_VOLATILE,KEY_WRITE,NULL,&hkey,NULL))<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
{return FALSE;}
if(ERROR_SUCCESS !=RegSetValueEx(hkey,lpItem,0,REG_SZ,(LPBYTE)”90”,2))
{
RegCloseKey(hkey); return FALSE;
}
RegCloseKey(hkey);
(程序1)
这段程序很简单,就是打开注册表,并写值。在98或者管理员权限下基本上不会出现什么问题。但存在什么样的潜在问题呢?我们做这样的假设,这段代码运行在用户态的打印机驱动程序的某个DDI接口中,比如DrvEnablePDEV。这样当不同用户进行打印时这段代码都需要被调用。于是问题出现了,在其他用户权限下,有可能打开或者设置值失败。GetLastError()返回5(Access denied)。原因是当你建立相关子键"Software//007h”时使用了NULL做为安全权限(lpSecurityAttributes)地参数。使用NULL意味着从父键直接继承DACL,而在这个DACL中一旦不包含对你所使用的帐户赋予权限的ACE,你对注册表的相关操作必然失败。(枚举"Software”的各个ACE的代码见后,但读懂ACE字符串有点难度,简单来说就是Built-in users只有对"Software”进行读的权利,所以Users组和Guest组的用户将无法写你所建立的子键”007h”,因为用上述方式建立的子键的DACL继承自"Software”)。为避免这种情况,建立注册表键时要明确制定安全权限。代码如下(from msdn 有更改):
这段代码建立一个管理员可以进行任何操作,任何用户都可以读写的子键,程序和相关结构的说明将在下节进行。
SECURITY_ATTRIBUTES uSecurityAttributes;
PSID pEveryoneSID = NULL, pAdminSID = NULL;
PACL pACL = NULL;
PSECURITY_DESCRIPTOR pSD = NULL;
EXPLICIT_ACCESS ea[2];
SID_IDENTIFIER_AUTHORITY SIDAuthWorld = SECURITY_WORLD_SID_AUTHORITY;
SID_IDENTIFIER_AUTHORITY SIDAuthNT = SECURITY_NT_AUTHORITY;
SECURITY_ATTRIBUTES sa;
LONG lRes;
HKEY hkSub = NULL;
// Create a well-known SID for the Everyone group.
BOOL bResult=AllocateAndInitializeSid(&SIDAuthWorld, 1,
SECURITY_WORLD_RID,
0, 0, 0, 0, 0, 0, 0,
&pEveryoneSID);
// Initialize an EXPLICIT_ACCESS structure for an ACE.
// The ACE will allow Everyone read access to the key.
ZeroMemory(&ea, 2*sizeof(EXPLICIT_ACCESS));
ea[0].grfAccessPermissions = KEY_READ|KEY_WRITE ;
ea[0].grfAccessMode = SET_ACCESS;
ea[0].grfInheritance= NO_INHERITANCE;
ea[0].Trustee.TrusteeForm = TRUSTEE_IS_SID;
ea[0].Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP;
ea[0].Trustee.ptstrName = (LPTSTR) pEveryoneSID;
AllocateAndInitializeSid(&SIDAuthNT, 2,
SECURITY_BUILTIN_DOMAIN_RID,
DOMAIN_ALIAS_RID_ADMINS,
0, 0, 0, 0, 0, 0,
&pAdminSID);
// Initialize an EXPLICIT_ACCESS structure for an ACE.
// The ACE will allow the Administrators group full access to the key.
ea[1].grfAccessPermissions = KEY_ALL_ACCESS;
ea[1].grfAccessMode = SET_ACCESS;
ea[1].grfInheritance= NO_INHERITANCE;
ea[1].Trustee.TrusteeForm = TRUSTEE_IS_SID;
ea[1].Trustee.TrusteeType = TRUSTEE_IS_GROUP;
ea[1].Trustee.ptstrName = (LPTSTR) pAdminSID;
// Create a new ACL that contains the new ACEs.
dwRes = SetEntriesInAcl(2, ea, NULL, &pACL);
// Initialize a security descriptor.
pSD = (PSECURITY_DESCRIPTOR) LocalAlloc(LPTR,
SECURITY_DESCRIPTOR_MIN_LENGTH);
InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(pSD,
TRUE, // bDaclPresent flag
pACL,
FALSE);
// Initialize a security attributes structure.
sa.nLength = sizeof (SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = pSD;
sa.bInheritHandle = FALSE;
if ((dwErr=RegCreateKeyExW(HKEY_LOCAL_MACHINE,L"Software//800",0,NULL,
REG_OPTION_NON_VOLATILE,KEY_READ|KEY_WRITE,&sa,&hkey,NULL))!=ERROR_SUCCESS)
{ return ; }
else if ((dwErr=RegSetValueEx(hkey,lpItem,0,REG_SZ,(LPBYTE)lpVer90,2))
!=ERROR_SUCCESS)
{ RegCloseKey(hkey);return; }
RegCloseKey(hkey);
if(pAdminSID)
FreeSid(pAdminSID);
if (pEveryoneSID)
FreeSid(pEveryoneSID);
if (pACL)
LocalFree(pACL);
if (pSD)
LocalFree(pSD);
(程序2)
下面为读取当前注册表键安全信息并把它转为字符串的程序,转化后的字符串的解析,参见msdn.
DWORD dwRes;
PACL pOldDACL = NULL;
PSECURITY_DESCRIPTOR pSD = NULL;
PSID pprimarysid=NULL,pownersid=NULL;
LPSTR pstring;
HKEY hObject;
if(ERROR_SUCCESS!=RegOpenKeyEx(HKEY_LOCAL_MACHINE,"Software//800",0,KEY_READ,&hObject))
return 0;
// Get a pointer to the existing DACL.
dwRes = GetSecurityInfo((HANDLE)hObject, SE_REGISTRY_KEY ,
DACL_SECURITY_INFORMATION|GROUP_SECURITY_INFORMATION
|OWNER_SECURITY_INFORMATION,
&pownersid, &pprimarysid, &pOldDACL, NULL, &pSD);
ConvertSecurityDescriptorToStringSecurityDescriptor(pSD,SDDL_REVISION_1,
DACL_SECURITY_INFORMATION|GROUP_SECURITY_INFORMATION
|OWNER_SECURITY_INFORMATION,
&pstring,NULL);
if(pSD != NULL)
LocalFree((HLOCAL) pSD);
if(pstring!=NULL)
LocalFree((HLOCAL)pstring);
RegCloseKey(hObject);
(程序 3)
分享到:
相关推荐
OPC DA 2.0(OLE for Process Control Data Access 2.0)是一种自动化数据访问接口标准,设计用于工业过程控制领域的软件开发。该标准由OPC基金会制定,旨在促进不同厂商之间的服务器和客户端无缝协作,简化开发流程...
NT可能采用了ASP.NET MVC(Model-View-Controller)架构,这是一种设计模式,将应用程序的业务逻辑、用户界面和数据处理分离,提高代码的可读性和可测试性。 3. 数据访问层:Discuz!NT v2.5 Access For .Net很可能...
Access Control in NT NT Rights and Privileges Who Are You in NT? Permissions for NT Files and Directories How Hackers Get around Access Control How to Improve upon Access Control Memco SeOS ...
这包括设置访问控制列表(Access Control Lists, ACLs)来限制特定用户的访问,启用CHAP或PAP身份验证增强安全性,以及配置加密技术如PPP的MPPE(Microsoft Point-to-Point Encryption)来保护数据传输。 总的来说...
OPC XML 技术是OPC(OLE for Process Control)数据访问标准的一种扩展,它主要应用于工业自动化领域,旨在促进不同厂商开发的服务器和客户端之间的无缝互操作性。OPC XML技术是在OPC Data Access 3.0版本中引入的...
试题中提到的账户组别,如 Administrators、Guest、Users、Everyone,这些组别在Windows NT 2000中用于设置不同的访问权限和控制用户对资源的访问。管理员组拥有最高权限,可以完全控制计算机和网络资源;而Everyone...
5. **安全与权限控制**:Windows NT 5.2在权限控制和安全性方面有显著提升,例如引入了ACL(Access Control Lists)和UAC(User Account Control)。源代码可以展示这些机制的实现,对理解系统安全有重大意义。 6. ...
nt recognition and management can achieve personnel management. This paper designs a fingerprint recognition access control system based on microcontrollers, aiming to strengthen personnel access ...
OPC(OLE for Process Control)技术是一种在过程控制行业中实现自动化、控制应用、现场系统/设备与业务/办公应用之间更高互操作性的标准接口协议。OPC Data Access(OPC DA)是OPC规范的核心部分,它定义了如何访问...
- 支持多种操作系统平台,如Windows Vista、2000、XP、NT、Solaris、Linux、Unix、FreeBSD、NetBSD、HP-Unix、OS-2等,并兼容嵌入式操作系统如VxWorks、QNX Nutrino、Windows CE、OSE等。 ##### 3. 额外服务支持 - ...
为了增强安全性,Access Server可以通过TACACS(Terminal Access Controller Access Control System)服务器进行用户认证。这通常涉及到Windows NT服务器作为TACACS服务器,运行Cisco的Easy ACS 1.0软件。 - **启用...
- **ISO/OSI模型**:即开放系统互联基本参考模型(Open Systems Interconnection Basic Reference Model),分为七层,包括物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。 - **TCP/IP协议簇**:作为...
具体地,它提到了GENESIS32能够运行在多个版本的Windows操作系统上,如Windows 98、ME、2000、XP、NT、CE、Pocket PC、以及Windows 2003 Server等。这说明该软件对操作系统具有很好的兼容性,能够覆盖从传统台式...
MAC地址(Media Access Control Address),也称为物理地址,是由48位(6个字节)的二进制数组成,通常用16进制表示。MAC地址由IEEE(电气与电子工程师协会)分配,并且每个MAC地址都是全球唯一的。MAC地址的主要...
26. **Windows 2000 Server**:它是Windows NT Server的后续产品,不默认安装DNS服务器,但可以手动安装;它可以运行多种路由协议,包括OSPF;安装时通常建议至少有一个主分区。 27. **主机IP地址**:正确的主机IP...
This VB6 code cleans the ILOVEYOU virus from systems<END><br>38 , shras21.zip Custom Control, that lets you have full control of Dial Up Networking<END><br>39 , FullBrowser.zip : This is A ...
Integrated Model指的是将多个组件集成在一起的模型,常用于系统设计。Inter Frame Gap是在视频编码中两个连续帧之间的间隔。Interactive Communication指的是交互式通信,如在线聊天和视频会议。Interenterprise ...
二、命令状态 1. router> 路由器处于用户命令状态,这时用户可以看路由器的连接状态,访问其它网络和主机,但不能看到和更改路由器的设置内容。 2. router# 在router>提示符下键入enable,路由器进入特权命令状态...
Note: Output buffering can also be controlled via Output Buffering Control ; functions. ; Possible Values: ; On = Enabled and buffer is unlimited. (Use with caution) ; Off = Disabled ; Integer = ...
Python参考手册,官方正式版参考手册,chm版。以下摘取部分内容:Navigation index modules | next | Python » 3.6.5 Documentation » Python Documentation contents What’s New in Python ...