我正在尝试使用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组的成员。我是谁。
可能是什么问题?
答案 0 :(得分:0)
在其他人有时间回答之前,我通常会找到自己问题的答案。
问题是在Windows Server 2012域控制器中,写入public(和personal)属性的权限不会授予“SELF”。我想写的字段属于公共属性。默认情况下,用户能够在Windows Server 2012中自行更改的唯一属性似乎是“Private-Information”,其中包含ms-PKI-Credential-Roaming-Tokens,ms-PKI-RoamingTimeStamp,{{3} },ms-PKI-DPAPIMasterKeys
为什么用户无权在Windows Server 2012 AD中写入自己的个人字段,Microsoft ??!?!?!
<强> EDITED 强>
另一个问题的答案在于ms-PKI-AccountCredentials。我无法在那里写,因为我使用管理帐户登录。
如果相关用户是或是管理组的成员,例如域管理员,帐户操作员,备份操作员,打印操作员等,则AdminSDHolder对象通过将他们的权限重置为默认值来保护这些组的成员。分钟,也打破了他们的权限继承。