选择 AD ntSecurityDescriptor 属性作为非管理员

2023-12-10

我正在为 Active Directory ACL/ACE 开发 SDDL/安全描述符解析器。我几乎完成了,当我使用管理帐户连接到 LDAP 时,一切正常。

但是,当我尝试查询ntSecurityDescriptor作为非管理帐户,它不返回任何值。用户帐户本身有权读取该属性。当我开始调查这个问题时,我遇到了以下 LDAP 服务器控件:

https://msdn.microsoft.com/en-us/library/cc223323.aspx

LDAP_SERVER_SD_FLAGS_OID 控件与 LDAP 搜索一起使用 请求控制 Windows 安全描述符的一部分 取回。 DC 仅返回证券的指定部分 描述符。它还与 LDAP 添加和修改请求一起使用 控制要修改的 Windows 安全描述符的部分。直流电 仅修改安全描述符的指定部分。

当将此控制发送到 DC 时,controlValue 字段设置为 以下 ASN.1 结构的 BER 编码。

 SDFlagsRequestValue ::= SEQUENCE {
     Flags    INTEGER
 }

Flags 值具有以下格式,以大端字节表示 命令。 X 表示未使用的位,应由客户端设置为 0,并且 服务器必须忽略它。

指定未设置位或不使用 LDAP_SERVER_SD_FLAGS_OID 控件的 Flags 相当于将 Flags 设置为 (OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION | SACL_SECURITY_INFORMATION)。将此控制发送到 DC 不会导致服务器在其响应中包含任何控制。

文档中该声明的最后部分似乎不正确,至少在非管理用户的上下文中不正确。

我的问题:我应该如何使用标准 PHP LDAP 库函数将此控件发送到 LDAP?我知道我必须设置服务器控件,但我不确定如何对值进行编码。我已将范围缩小到最简单的示例:

$user = '[email protected]';
$pass = 'secret';
$server = 'dc1.example.local';

$ldap = ldap_connect($server);
ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ldap, LDAP_OPT_REFERRALS, 0);

ldap_bind($ldap, $user, $pass);
$ctrl1 = array(
    "oid" => "1.2.840.113556.1.4.801",
    "iscritical" => true,
    // How should this value be set???
    "value" => sprintf("%c%c%c%c%c", 48, 3, 2, 1, 15)
);
if (!ldap_set_option($ldap, LDAP_OPT_SERVER_CONTROLS, array($ctrl1))) {
    echo "Failed to set server controls";
}

$searchUser = "user";
$dn = "dc=example,dc=local";
$filter="(sAMAccountName=$searchUser)";
$attr = array("ntsecuritydescriptor");

$sr = ldap_search($ldap, $dn, $filter, $attr);
$info = ldap_get_entries($ldap, $sr);

// Should contain ntSecurityDescriptor...but it does not.
var_dump($info);

我知道控件的值需要进行 BER 编码,但我不确定如何实现文档中定义的值。我找到了以下 Java 示例:

https://github.com/Tirasa/ADSDDL/blob/master/src/main/java/net/tirasa/adsddl/ntsd/controls/SDFlagsControl.java

但我一直无法将那里发生的事情翻译成 PHP。有任何想法吗?


问题似乎是非特权 AD 用户帐户将无权访问安全描述符的 SACL。为了解决这个问题并仍然检索ntSecurityDescriptor(减去 SACL),发送带有所有其他标志集的值(值为 7)的控制:

// OWNER_SECURITY_INFORMATION + GROUP_SECURITY_INFORMATION + DACL_SECURITY_INFORMATION
$sdFlags = 7;

$ctrl1 = array(
    "oid" => "1.2.840.113556.1.4.801",
    "iscritical" => true,
    "value" => sprintf("%c%c%c%c%c", 48, 3, 2, 1, $sdFlags)
);
if (!ldap_set_option($ldap, LDAP_OPT_SERVER_CONTROLS, array($ctrl1))) {
    echo "Failed to set server controls";
}

我的猜测是MS文档没有错,默认值LDAP_SERVER_SD_FLAGS_OID is for all要设置的标志(包括 SACL)。由于大多数普通帐户无权访问该 SACL,AD 可能决定不返回安全描述符的任何部分,因此不会ntSecurityDescriptor即使您选择了查询,也会返回该值。

另一个重要的注意事项是,如果您使用 LDAP 分页,它似乎会干扰此控制。您不能同时使用分页和此控件。我不确定这是否是该控件的一般副作用,或者是 PHP 的 LDAP 模块中服务器控件如何完成的问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

选择 AD ntSecurityDescriptor 属性作为非管理员 的相关文章

  • Blade 中无法访问请求错误(Laravel 5.2)

    我已经使用 Laravel 好几个月了 但从未遇到过这样的问题 我创建了一个简单的 Request 类来验证更新用户请求 如果遵循验证规则 该请求可以正常工作 如果验证规则失败 我们应该返回上一页并在 html 中显示所有错误 根据我的说法
  • 检测 PHP 中字符串的字符集(UTF-8 或 Windows-1256)

    我正在根据 简单的 HTML DOM http simplehtmldom sourceforge net 并且我想在获取 URL 的内部文本后检测字符串的字符集 以使用以下命令将其转换为 UTF 8 iconv 我尝试了很多东西 但没有一
  • document.querySelectorAll("input[type=checkbox") 的结果数组的顺序是否有保证?

    我在页面正文中有以下 HTML 这些是此 HTML 页面上类型复选框的唯一输入 fieldset legend North Face legend N A1 fieldset
  • Imagick setColor 不适用于 php

    我尝试将所有像素设置为黑色 但它不起作用 我得到与原始图像相同的图像 这是我的代码 image new Imagick DIR image new jpg i 0 j 0 while i lt 100 j 0 while j lt 100
  • php 中的浏览器名称?

    我们如何使用php脚本获取浏览器名称和版本信息 正如 Palantir 所说 另外看看 get browser 函数 您还可以在其中检查浏览器中启用的功能
  • PHP SNMP - 找不到模块

    我已启用 SNMP 模块并尝试使用该模块中的功能 我已将 MIBDIRS 环境变量设置为我的 mib 所在的位置 但我仍然收到这些 找不到模块 警告 Cannot find module IP MIB At line 0 in none C
  • 重置密码 电子邮件

    我是 Laravel 开发新手 目前正在从事小型项目 我想自定义重置密码的电子邮件模板 甚至将其链接到完全不同的模板 对于身份验证脚手架 我使用了php artisan make auth命令 但是 默认重置密码功能使用默认的 Larave
  • LinkedIn Groups API - 在单个 API 请求中获取多个群组的群组徽标

    Using LinkedIn 群组 API http developer linkedin com documents groups api 我正在显示用户在 LinkedIn 上所属的组列表 使用以下命令可以清楚地在一次调用中获取组列表
  • UserPrincipal 相当于 DirectoryEntry.Invoke?

    我正在更新与应用程序中的 AD 交互的代码 当前代码使用ActiveDs接口 我正在更改代码以使用 System DirectoryServices AccountManagement 命名空间 我们的应用程序允许用户存储密码提示 这存储在
  • 如何从 PHP 输出 XML 字符串

    我正在获取一个 XML 字符串并在 PHP 中对其进行编辑 以便在访问 PHP 文件时最终输出编辑后的 XML 字符串 我一直在尝试使用 echo 和 print 来输出 XML 文档 但它只打印最里面标签内的数据 我希望它的功能就像直接加
  • php simpleXMLElement 到数组:空值

    我有以下 XML
  • 如何以最少的查询次数获取帖子列表和关联标签

    我的表格结构如下 标签 更多的是一个类别 id 标签名称 描述 slug POSTS ID 标题 网址 邮戳 id idPost idTag USERS ID 用户名 userSlug VOTES id idPost idUser 每个帖子
  • 在 Codeigniter 中编写模型代码的最佳方法是什么

    我对于在 codeigniter 中使用哪种技术来编码模型感到非常困惑 我进行了很多搜索 发现了各种编码人员使用的各种方法 请指导我使用 codeigniter 编写模型类的最佳方法 例子很少 有些方法签名中需要很长的参数 function
  • 如何修复网站 iframe 错误?

    当我访问此网址时 警告 推荐使用一些广告拦截器 网页链接加载良好 没有错误 但是 当我尝试通过加载同一页面时iframe在我的html代码中 出现错误 我的html代码
  • jQuery id 选择器在有 .在 ID 中[重复]

    这个问题在这里已经有答案了 我的html代码如下 div class chatbox html markup which is validated div 在上面的代码中dipesh parmardiv 动态添加 我正在使用以下代码访问它
  • 显示表中的记录

    我的第一个 PHP 项目遇到了一些麻烦 我试图从 MySQL 数据库 有 3 条记录 获取数据并将其显示在表格中 问题是它似乎只显示记录 2 和 3 它跳过了第 1 条记录 请参阅我的代码并在下面显示 if mysqli connect e
  • 如何在 Python 中包含 PHP 脚本?

    我有一个 PHP 脚本 news generator php 当我包含它时 它会抓取一堆新闻项并打印它们 现在 我在我的网站 CGI 中使用 Python 当我使用 PHP 时 我在 新闻 页面上使用了这样的内容 为了简单起见 我删掉了这个
  • 自定义 WP 主题时,我应该将导航栏放在“”标签之前还是之后?

    我正在通过制作子主题来自定义 WP 主题 我将 Bootstrap 中的导航栏放入子主题目录中的 header php 文件中 但是 我不确定在哪里放置导航栏代码 我可以把它都放在前面and之后标记成功 例如 无论我选择哪一个 导航栏都显示
  • Smarty输出空白页

    已解决 模板文件错误 我有这样的 Smarty 设置 require once smarty Smarty class php smarty new Smarty smarty gt compile dir compile dir smar
  • WooCommerce 使用 AJAX 设置购物车数量?

    我已经为此绞尽脑汁好几天了 需要一些指导 我正在为 WooCommerce 网站完全从头开始制作自定义主题 现在我正在尝试让购物车功能正常工作 我一直试图使用按钮 来更新购物车中产品的数量 对我来说问题似乎是WC 我在functions p

随机推荐