安全描述符定义语言(SDDL)用于表示安全描述符。 设备对象的安全性可由 放置在 INF 文件中 或传递给 IoCreateDeviceSecure 的 SDDL 字符串指定。 安全描述符定义语言已完整记录在 Microsoft Windows SDK 文档中。
虽然 INF 文件支持整个 SDDL 范围,但 IoCreateDeviceSecure 例程仅支持一部分语言。 此处定义了此子集。
设备对象的 SDDL 字符串的格式为“D:P”,后跟一个或多个表达式,其格式为“(A;;Access;;;SID)”。 SID 值指定一个安全标识符,用于确定 Access 值应用于谁(例如,用户或组)。 Access 值指定 SID 允许的访问权限。 Access 和 SID 值如下所示。
对设备对象使用 SDDL 时,驱动程序必须链接到 Wdmsec.lib。
访问
指定一个 ACCESS_MASK 值,该值确定允许的访问。 此值可以编写为“0x十六进制”形式的十六进制值,也可以编写为表示访问权限的双字母符号代码序列。
以下代码可用于指定通用访问权限。
代码 | 通用访问权限 |
---|---|
乔治亚州 |
GENERIC_ALL |
GR |
通用读取 (GENERIC_READ) |
吉瓦 |
通用写入 |
GX |
GENERIC_EXECUTE |
以下代码可用于指定特定访问权限。
代码 | 特定访问权限 |
---|---|
RC |
READ_CONTROL |
SD |
删除 |
WD |
WRITE_DAC |
N/A (Additional context is required to provide an accurate and faithful translation.) |
写入所有者 |
GENERIC_ALL授予上述两个表中列出的所有权限,包括更改 ACL 的能力。
SID
指定授予指定访问权限的 SID。 SID 表示帐户、别名、组、用户或计算机。
以下 SID 表示计算机上的 帐户 。
SID | DESCRIPTION |
---|---|
SY |
系统 表示操作系统本身,包括其用户模式的组件。 |
LS 系列 |
本地服务 本地服务的预定义帐户(也属于“已验证”和“世界”)。 此 SID 从 Windows XP 开始可用。 |
NS 系列 |
网络服务 用于网络服务的预定义帐户(同样属于“已验证”和“全局”)。 此 SID 从 Windows XP 开始可用。 |
以下 SID 表示计算机上的 组 。
SID | DESCRIPTION |
---|---|
BA |
管理员 计算机上的内置管理员组。 |
BU |
内置用户组 涵盖所有本地用户帐户和域用户的组。 |
BG |
内置来宾组 包含使用本地或域来宾帐户登录的用户的组。 |
以下 SID 描述了用户经过身份验证的程度。
SID(安全标识符) | DESCRIPTION |
---|---|
澳大利亚 |
经过身份验证的用户 由本地计算机或域识别的任何用户。 使用 Builtin 来宾帐户登录的用户不会进行身份验证。 但是,计算机或域上具有单个帐户的来宾组成员将进行身份验证。 |
一 |
匿名登录用户 未使用标识(例如匿名网络会话)登录的任何用户。 使用 Builtin 来宾帐户登录的用户不会进行身份验证或匿名。 此 SID 从 Windows XP 开始可用。 |
以下 SID 描述了用户如何登录到计算机。
SID | DESCRIPTION |
---|---|
IU |
交互式用户 最初以交互方式登录到计算机的用户,例如本地登录和远程桌面登录。 |
NU |
网络登录用户 远程访问计算机的用户,无需交互式桌面访问(例如文件共享或 RPC 调用)。 |
威腾电子 |
世界 在 Windows XP 之前,此 SID 涵盖每个会话,无论是经过身份验证的用户、匿名用户还是 Builtin 来宾帐户。 从 Windows XP 开始,此 SID 不包括匿名登录会话;它仅涵盖经过身份验证的用户和 Builtin 来宾帐户。 世界 SID 也不涵盖不受信任的或“受限”代码。 有关详细信息,请参阅下表中受限代码 (RC) SID 的说明。 |
以下这些 SID 值得特别提及。
SID | DESCRIPTION |
---|---|
钢筋混凝土 |
受限代码 此 SID 用于控制不受信任的代码的访问。 针对具有 RC 的令牌的 ACL 验证涉及两个检查,一个检查与令牌的常规 SID 列表进行比对(例如包含 WD),另一个与第二个列表进行比对(通常包含 RC 和原始令牌 SID 的子集)。 仅当令牌通过这两个测试时,才授予访问权限。 因此,RC 实际上与其他 SID 结合使用。 任何指定 RC 的 ACL 还必须指定 WD。 当 RC 与 ACL 中的 WD 配对时,会描述一个包括不受信任的代码在内的所有用户的超集。 非受信任的代码可能是使用资源管理器中的“以其他身份运行”选项启动的代码。 默认情况下,World 不涵盖不受信任的代码。 |
UD |
User-Mode 驱动程序 此 SID 授予对用户模式驱动程序的访问权限。 目前,此 SID 仅涵盖为 User-Mode 驱动程序框架(UMDF)编写的驱动程序。 从 Windows 8 开始,此 SID 可用。 在早期版本的 Windows 中,不能识别“UD”缩写,必须指定此 SID(S-1-5-5-84-0-0-0-0-0)的完全限定形式,以授予对 UMDF 驱动程序的访问权限。 有关详细信息,请参阅 User-Mode Driver Framework 文档中的 控制设备访问。 |
设备对象的 SDDL 示例
本部分介绍在 Wdmsec.h 中找到的预定义 SDDL 字符串。 还可以将这些字符串用作模板,为设备对象定义新的 SDDL 字符串。
SDDL_DEVOBJ_KERNEL_ONLY
“D:P”
SDDL_DEVOBJ_KERNEL_ONLY为“空”ACL。 用户模式代码(包括作为系统运行的进程)无法打开设备。
创建 PDO 时,PnP 总线驱动程序可以使用此描述符。 然后,INF 文件可以为设备指定松散的安全设置。 通过指定此描述符,总线驱动程序将确保不会尝试在处理 INF 之前打开设备。
同样,非 WDM 驱动程序可以使用此描述符使其设备对象不可访问,直到相应的用户模式程序(如安装程序)在注册表中设置最终的安全描述符。
在所有这些情况下,默认情况下是严格的安全性,并在必要时适时放松。
SDDL_DEVOBJ_SYS_ALL
“D:P(A;;GA;;;SY)”
SDDL_DEVOBJ_SYS_ALL类似于SDDL_DEVOBJ_KERNEL_ONLY,但除了内核模式代码之外,作为系统运行的用户模式代码也允许打开设备进行任何访问。
旧驱动程序可以使用此 ACL 从严格的安全设置开始,并在运行时通过使用 SetFileSecurity 用户模式函数,将设备的访问权限开放给各个用户。 在这种情况下,服务必须作为系统运行。
SDDL_DEVOBJ_SYS_ALL_ADM_ALL
“D:P(A;;GA;;;SY)(A;;GA;;;BA)”
SDDL_DEVOBJ_SYS_ALL_ADM_ALL允许内核、系统和管理员完全控制设备。 其他用户无法访问该设备。
SDDL_DEVOBJ_SYS_ALL_ADM_RWX_WORLD_R
“D:P(A;;GA;;;SY)(A;;GRGWGX;;;BA)(A;;GR;;;WD)”
SDDL_DEVOBJ_SYS_ALL_ADM_RWX_WORLD_R允许内核和系统对设备进行全面控制。 默认情况下,管理员可以访问整个设备,但不能更改 ACL(管理员必须先控制设备)。
向所有人(世界 SID)授予读取权限。 不受信任的代码无法访问设备(不受信任的代码可能是使用资源管理器中的“运行方式”选项启动的代码。默认情况下,World 不涵盖受限代码。
另请注意,不会向普通用户授予遍历访问权限。 因此,这可能不是具有命名空间的设备的适当描述符。
SDDL_DEVOBJ_SYS_ALL_ADM_RWX_WORLD_R_RES_R
“D:P(A;;GA;;;SY)(A;;GRGWGX;;;BA)(A;;GR;;;WD)(A;;GR;;;RC)”
SDDL_DEVOBJ_SYS_ALL_ADM_RWX_WORLD_R_RES_R允许内核和系统完全控制设备。 默认情况下,管理员可以访问整个设备,但不能更改 ACL(管理员必须先控制设备)。
向所有人(世界 SID)授予读取访问权限。 此外,还允许不受信任的代码访问代码。 不受信任的代码可能是使用资源管理器中的“以...身份运行”选项启动的代码。 默认情况下,World 不涵盖受限代码。
另请注意,不会向普通用户授予遍历访问权限。 因此,这可能不是具有命名空间的设备的适当描述符。
这些 SDDL 字符串不包含任何继承修饰符。 因此,它们仅适用于设备对象,不应用于文件或注册表项。 有关使用 SDDL 指定继承的详细信息,请参阅 Microsoft Windows SDK 文档。