这与此主题中的问题相同:Security ID Structure Invalid , Getting this error when setting the new SecurityDescriptor for AD user properties但我使用的是C ++而不是.Net。
我想为Active Directory帐户设置“用户无法更改密码”标记。我正在使用this code from MS但收到错误
安全ID结构无效。
在此行的SetUserCannotChangePassword()
方法中会发生这种情况:
//update the security descriptor property
hr = pads->Put(sbstrSecDesc, svar);
只有当我从与我想要设置AD标志的用户不在同一域中的计算机进行测试时,才会出现此错误。如果我在同一个域上运行我的应用程序,我修改一切正常。
关于此错误代码I found this article。打开LSA端口的建议不起作用 - 我停用了防火墙,但没有解决问题。
我只有设置此标志的问题。其他标志为“UserMustChangePassword”没问题。
有什么建议吗?
答案 0 :(得分:1)
我不确定这会解决您的问题,因为问题很可能是Microsoft框架中的某种错误。
您提到只有在您当前正在更改的域外的计算机/用户上执行此错误时才会发生此错误,因此您可能会尝试在执行应用程序之前建立与域服务器的可信连接。 这可以通过许多不同的方式完成,但最简单的方法是将IPC $隐藏共享作为域管理员安装在域控制器上。只需在命令提示符下执行:
NET USE \\<DOMAIN-CONTROLER>\IPC$ /user:<DOMAIN-NAME>\<Domain-admin-user> <domain-admin-user-password>
同样,它可能会或可能不会解决您的问题,但它值得一试:)
答案 1 :(得分:1)
我现在无法解决你的问题,但在我读完另一个答案后,我决定写一些评论作为答案,以获得更多的地方。我确信问题的根源是内部使用LookupAccountSid函数或LookupAccountName。所以你得到一个错误。我发现错误ERROR_INVALID_SID
(1337)错误:“安全ID结构无效”。仅在某些API中记录,例如ConvertStringSidToSid,ConvertSidToStringSid,AddAccessAllowedAce,AddAccessAllowedAceEx以及其他一些不应在您描述的代码中使用的API。
如果使用LookupAccountName
获取某个帐户的SID,则可以设置lpSystemName
参数。如果需要从域中解析计算机所属域中不存在直接信任的域名,则这一点非常重要。例如,如果您有一个主域和两个资源域,并且尝试从另一个资源域中解析计算机上一个资源域中的帐户。如果使用NULL作为lpSystemName
将失败,但是如果使用来自主域的任何服务器作为lpSystemName
,例如主域的域控制器,您将是能够从任何域解析任何帐户。
如果任何“为LSA打开端口”将无法正常工作。为了真正帮助您,我需要了解您在pwszUserDN
或ADsOpenObject
中使用的SetUserCannotChangePassword
语法。您可以在Binding String中使用一些可能性(另请参阅here)。如果您要更改语法,我希望您能解决问题。例如,您可以尝试显式指定服务器。例如,您可以使用
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