设置 AD 标志时获取"The security ID structure is invalid"

Getting "The security ID structure is invalid" while setting AD flag

本文关键字:ID structure is invalid security The 标志 获取 设置 AD      更新时间:2023-10-16

这是与本线程相同的问题:安全ID结构无效,在为AD用户属性设置新的SecurityDescriptor时获得此错误,但我使用c++而不是。net。

我想为Active Directory帐户设置"用户不能更改密码"标志。我从MS使用这个代码,但得到一个错误

安全ID结构无效。

这发生在SetUserCannotChangePassword()方法中,在这一行:

//update the security descriptor property
hr = pads->Put(sbstrSecDesc, svar);

此错误仅在我从与我想设置AD标志的用户不在同一域中的计算机进行测试时发生。如果我在同一个域上运行我的应用程序,我修改一切都很好。

关于这个错误代码,我找到了这篇文章。为LSA打开端口的建议不起作用——我去激活了防火墙,但这并不能解决问题。

我只有设置这个标志的问题。其他标志如"UserMustChangePassword"没有问题。

有什么建议吗?

我不确定这是否解决了您的问题,因为问题很可能是微软框架中的某种错误。

你提到这个错误只会发生在你正在更改的域之外的计算机/用户上,所以你可能会在执行应用程序之前尝试建立到域服务器的可信连接。这可以通过许多不同的方式完成,但最简单的是将IPC$隐藏共享作为域管理员挂载到域控制器上。只需在命令提示符下执行以下命令:

NET USE \<DOMAIN-CONTROLER>IPC$ /user:<DOMAIN-NAME><Domain-admin-user> <domain-admin-user-password>

同样,它可能解决也可能不解决你的问题,但值得一试:)

我现在不能提供你的问题的解决方案,但在我读了另一个答案后,我决定写一些评论作为答案有更多的地方。我确信问题的根源是LookupAccountSid函数或LookupAccountName在内部的使用。你会得到一个错误。我发现奇怪的是,错误ERROR_INVALID_SID(1337)错误:"安全ID结构无效。"仅记录在一些API中,如ConvertStringSidToSid, ConvertSidToStringSid, AddAccessAllowedAce, AddAccessAllowedAceEx和其他一些不应该在您描述的代码中使用。

例如使用LookupAccountName获取某个帐户的SID,则可以设置lpSystemName参数。如果需要从计算机所属的域解析没有直接信任的域的名称,则这一点非常重要。例如,如果您有一个主域和两个资源域,并且您尝试从计算机上的一个资源域从另一个资源域解析帐户。在这种情况下,使用NULL作为lpSystemName将失败,但在使用主域的任何服务器作为lpSystemName的情况下,例如主域的域控制器,您将能够解析来自任何域的任何帐户。

在这种情况下,任何"为LSA打开端口"都将不起作用。为了能够真正帮助你,我需要知道pwszUserDN的语法,你在ADsOpenObjectSetUserCannotChangePassword中使用。您可以在绑定字符串中使用一些可能性(参见这里)。如果您更改语法,我希望可以解决这个问题。例如,您可以尝试显式指定服务器。例如,您可以使用

LDAP://server01/CN=Jeff Smith,CN=users,DC=fabrikam,DC=com

LDAP://domain2.fabrikam.com/CN=Users,DC=domain2,DC=fabrikam,DC=com
不是

LDAP://CN=Jeff Smith,CN=users,DC=fabrikam,DC=com