一般访问权限被拒绝尝试在AD中更新我自己的字段

时间:2015-03-02 14:25:38

标签: c++ active-directory ldap adsi

我正在尝试使用ADSI和C ++应用程序在Active Directory中更新与我自己的用户对象相关的字段。操作系统是Windows Server 2012 Standard。

我能够阅读,我可以毫无问题地调用Put,但是当我调用SetInfo时,它返回“General access denied”。我已经确认这是我自己正在尝试访问的用户对象。

我获得了我自己的FQDN:

GetUserNameEx(EXTENDED_NAME_FORMAT::NameFullyQualifiedDN, pszFullyQualifiedDN, &dwFullyQualifiedDN);

然后我像这样使用它:

LPTSTR pszObj = (LPTSTR)LocalAlloc(LPTR, dwMemToAlloc);
wcscpy_s(pszObj, dwMemToAlloc / sizeof(TCHAR), L"LDAP://");
wcscat_s(pszObj, dwMemToAlloc / sizeof(TCHAR), pszFullyQualifiedDN);

我绑定到这样的对象:

ADsGetObject(pszObj, IID_IADs, (LPVOID*)&pObject);

此调用成功:

pObject->Get(CComBSTR("Description"), &var);

此调用也成功:

VariantClear(&var);

V_BSTR(&var) = SysAllocString(L"Some new value");
V_VT(&var) = VT_BSTR;
hr = pObject->Put(CComBSTR("Description"), var);

尝试使用以下内容提交上述更改:

pObject->SetInfo();

这是它失败的地方。
它返回E_ACCESSDENIED常规访问被拒绝错误。

正如您所看到的,这是我自己的用户对象,我正在尝试更新。根据我的理解,假设我是Domain Users组的成员。我是谁。

可能是什么问题?

1 个答案:

答案 0 :(得分:0)

在其他人有时间回答之前,我通常会找到自己问题的答案。

问题是在Windows Server 2012域控制器中,写入public(和personal)属性的权限不会授予“SELF”。我想写的字段属于公共属性。默认情况下,用户能够在Windows Server 2012中自行更改的唯一属性似乎是“Private-Information”,其中包含ms-PKI-Credential-Roaming-Tokensms-PKI-RoamingTimeStamp,{{3} },ms-PKI-DPAPIMasterKeys

为什么用户无权在Windows Server 2012 AD中写入自己的个人字段,Microsoft ??!?!?!

<强> EDITED

另一个问题的答案在于ms-PKI-AccountCredentials。我无法在那里写,因为我使用管理帐户登录。

  

如果相关用户是或是管理组的成员,例如域管理员,帐户操作员,备份操作员,打印操作员等,则AdminSDHolder对象通过将他们的权限重置为默认值来保护这些组的成员。分钟,也打破了他们的权限继承。