跨会话创建Global命名互斥量:Win10报ERROR_ACCESS_DENIED而Win7正常的原因
这个差异的核心原因是Windows 10对Session 0隔离机制和全局命名对象的默认权限做了大幅收紧,而Windows 7的安全控制相对宽松。具体拆解成几点:
Session 0隔离的强化:
Windows Vista首次引入Session 0隔离,把服务和普通用户进程分开到不同会话,但Windows 7里,跨会话访问全局命名对象的限制并不严格——即使Session 0的进程先创建了Global\前缀的互斥量,Session 1的普通用户进程依然能正常打开或创建同名互斥量。而Windows 10为了提升系统安全性,进一步强化了Session 0的隔离:默认情况下,Session 1的普通用户进程没有权限访问Session 0中创建的全局命名对象,包括互斥量,所以调用CreateMutex()时会返回ERROR_ACCESS_DENIED。默认安全描述符的变化:
当你创建互斥量时如果没有显式指定SECURITY_ATTRIBUTES参数,系统会使用默认的安全描述符。在Windows 7中,这个默认描述符允许所有会话的进程访问全局命名对象;但Windows 10调整了默认规则,默认的安全描述符会拒绝非Session 0进程对Session 0全局对象的访问权限。这就导致了同样的代码在两个系统上的行为差异——你的程序没设置自定义安全属性,所以在Win10下Session 1进程拿不到权限。会话间权限模型的细化:
Windows 10针对会话间资源访问增加了更精细的权限控制,目的是防止普通用户会话(Session 1)意外访问或干扰Session 0中运行的服务/进程资源,减少权限泄露和恶意利用的风险。而Windows 7在这方面的设计更偏向兼容性,没有做这么严格的限制。
简单来说,Win10是为了安全收紧了全局对象的跨会话访问权限,而Win7保留了更宽松的兼容性设计,这就是你看到差异的根本原因。
内容的提问来源于stack exchange,提问作者IdolAdmin

