获得;安全ID结构无效";设置广告标志时 这是与本线程相同的问题:但是我使用C++而不是.NET.

获得;安全ID结构无效";设置广告标志时 这是与本线程相同的问题:但是我使用C++而不是.NET.,c++,active-directory,dns,C++,Active Directory,Dns,我想为Active Directory帐户设置标志“用户无法更改密码”。我正在使用,但出现了一个错误 安全ID结构无效 这发生在方法SetUserCannotChangePassword()的这一行: //update the security descriptor property hr = pads->Put(sbstrSecDesc, svar); 此错误仅在我从与我要设置AD标志的用户不在同一域的计算机上进行测试时发生。如果我在修改时在同一个域上运行我的应用程序,一切正常。 关于

我想为Active Directory帐户设置标志“用户无法更改密码”。我正在使用,但出现了一个错误

安全ID结构无效

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

//update the security descriptor property
hr = pads->Put(sbstrSecDesc, svar);
此错误仅在我从与我要设置AD标志的用户不在同一域的计算机上进行测试时发生。如果我在修改时在同一个域上运行我的应用程序,一切正常。

关于此错误代码。为LSA打开端口的建议不起作用-我停用了防火墙,但这并没有解决问题

我只有设置这个标志的问题。“UserMustChangePassword”等其他标志没有问题


有什么建议吗?

我不确定这是否解决了您的问题,因为问题很可能是Microsoft框架中的某种缺陷

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

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

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

我不确定这是否能解决您的问题,因为这个问题很可能是Microsoft框架中的某种缺陷

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

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

再说一次,它可能解决你的问题,也可能解决不了你的问题,但值得一试:)

我现在无法提供你问题的解决方案,但在我阅读了另一个答案后,我决定写一些评论作为答案,以便有更多的位置。我确信问题的根源在于函数的使用或函数的内部使用。所以你得到了一个错误。我发现奇怪的是,错误
error\u INVALID\u SID
(1337)错误:“安全ID结构无效。”仅在一些API中记录,如、,以及一些不应在您描述的代码中使用的其他API

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

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

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

而不是

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

我现在无法提供您问题的解决方案,但在我阅读了另一个答案后,我决定写一些评论作为答案,以便有更多的位置。我确信问题的根源在于函数的使用或函数的内部使用。所以你得到了一个错误。我发现奇怪的是,错误
error\u INVALID\u SID
(1337)错误:“安全ID结构无效。”仅在一些API中记录,如、,以及一些不应在您描述的代码中使用的其他API

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

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

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

而不是

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

这实际上是一个非常好的建议。我会调查并报告。@juergend:你有测试结果吗?@juergend:Schade。。。在这些问题中,你最好总是准确地描述广告结构、信托(及其方向)和你的限制。我知道很多方法