2008-11-07 7 views
0

я создал C# WebService, что позволяет нашим передние группы конца поддержки для просмотра и обновления нескольких выбранных значений Active Directory с помощью System.DirectoryServicesHOWTO - набор делегированы привилегии Active Directory

Поля, которые я хочу обновить это [ должность], отдел, телефон и сотрудник.

Я могу использовать учетную запись службы с правами «делегатов», чтобы обновить название [должность], отдел, телефон и т. Д., Но когда я пытаюсь обновить employeeid, я получаю сообщение об ошибке «без авторизации».

Если я использую учетную запись администратора домена, то тот же код работает нормально.

Я не хочу использовать учетную запись администратора домена для этого веб-сервиса, поэтому какие привилегии мне нужны?

ответ

3

ОТВЕТ

ADS_SCHEMA_ID_GUID_USER GUID позволяет обновлять сведения о базовом пользователе, включая идентификатор сотрудника

Based on MSDN article

VBScript используется для предоставления пользователя учетной записи службы выбранных делегированных прав:

REM # 
REM # Delegate AD property set admin rights to named account 
REM # Based on: http://www.microsoft.com/technet/scriptcenter/topics/security/propset.mspx 
REM # 

Const TRUSTEE_ACCOUNT_SAM   = "ad\ADStaffUpdates" 

Const ADS_ACETYPE_ACCESS_ALLOWED_OBJECT  = &H5 
Const ADS_RIGHT_DS_READ_PROP   = &H10 
Const ADS_RIGHT_DS_WRITE_PROP   = &H20 
Const ADS_FLAG_OBJECT_TYPE_PRESENT  = &H1 
Const ADS_FLAG_INHERITED_OBJECT_TYPE_PRESENT = &H2 
Const ADS_ACEFLAG_INHERIT_ACE   = &H2 

Const ADS_SCHEMA_ID_GUID_USER   = "{bf967aba-0de6-11d0-a285-00aa003049e2}" 
Const ADS_SCHEMA_ID_GUID_PS_PERSONAL  = "{77b5b886-944a-11d1-aebd-0000f80367c1}" 
Const ADS_SCHEMA_ID_GUID_PS_PUBLIC  = "{e48d0154-bcf8-11d1-8702-00c04fb96050}" 

ad_setUserDelegation "OU=USERS, DC=AD, DC=COM", TRUSTEE_ACCOUNT_SAM, ADS_SCHEMA_ID_GUID_PS_USER 
ad_setUserDelegation "OU=USERS, DC=AD, DC=COM", TRUSTEE_ACCOUNT_SAM, ADS_SCHEMA_ID_GUID_PS_PERSONAL 
ad_setUserDelegation "OU=USERS, DC=AD, DC=COM", TRUSTEE_ACCOUNT_SAM, ADS_SCHEMA_ID_GUID_PS_PUBLIC 

Function ad_setUserDelegation(   _ 
     ByVal strOU   _ 
     ,ByVal strTrusteeAccount _ 
     ,ByVal strSchema_GUID  _ 
     ) 

    Set objSdUtil   = GetObject("LDAP://" & strOU) 

    Set objSD   = objSdUtil.Get("ntSecurityDescriptor") 
    Set objDACL    = objSD.DiscretionaryACL 

    Set objAce   = CreateObject("AccessControlEntry") 

    objAce.Trustee   = strTrusteeAccount 
    objAce.AceFlags   = ADS_ACEFLAG_INHERIT_ACE 
    objAce.AceType   = ADS_ACETYPE_ACCESS_ALLOWED_OBJECT 
    objAce.Flags   = ADS_FLAG_OBJECT_TYPE_PRESENT OR ADS_FLAG_INHERITED_OBJECT_TYPE_PRESENT 

    objAce.ObjectType  = strSchema_GUID 

    objACE.InheritedObjectType = ADS_SCHEMA_ID_GUID_USER 
    objAce.AccessMask  = ADS_RIGHT_DS_READ_PROP OR ADS_RIGHT_DS_WRITE_PROP 
    objDacl.AddAce   objAce 

    objSD.DiscretionaryAcl  = objDacl 

    objSDUtil.Put   "ntSecurityDescriptor", Array(objSD) 
    objSDUtil.SetInfo 

End Function 


Function ad_revokeUserDelegation(  _ 
     ByVal strOU   _ 
     ,ByVal strTrusteeAccount _ 
     ) 

    Set objSdUtil   = GetObject("LDAP://" & strOU) 

    Set objSD   = objSdUtil.Get("ntSecurityDescriptor") 
    Set objDACL    = objSD.DiscretionaryACL 

    For Each objACE in objDACL 
     If UCase(objACE.Trustee) = UCase(strTrusteeAccount) Then 
       objDACL.RemoveAce objACE 
     End If 
    Next 

    objSDUtil.Put   "ntSecurityDescriptor", Array(objSD) 
    objSDUtil.SetInfo 

End Function 
0

образец кода (движущиеся части, по крайней мере)

string distinguishedname = "CN=Wicks\, Guy,OU=Users,DC=ad,DC=com" 
using (DirectoryEntry myDirectoryEntry = new DirectoryEntry(string.Format("LDAP://{0}", distinguishedname), null, null, AuthenticationTypes.Secure)) 
{ 
    try 
    { 
     myDirectoryEntry.Username = "serviceaccount"; 
     myDirectoryEntry.Password = "pa55word"; 

     myDirectoryEntry.Properties["employeeid"][0] = employeeID; 
     myDirectoryEntry.CommitChanges(); 
     setresult.result  = myDirectoryEntry.Properties["employeeid"][0].ToString(); 
    } 
    catch (Exception ex) 
    { 
     setresult.result  = ex.Message; 
    } 
} // end using 

(я извиняемся для моего C#)

0

делают пользователи вашей службы имеют право изменять эти поля через пользователь AD и компьютеры? , если они тогда, возможно, вы можете использовать олицетворение и просто сделать свой служебный хост-компьютер «доверенным для делегирования» (в свойствах AD для него) всегда работал отлично для меня.

+0

Нет. Наша политика AD заключается в том, что пользователи не могут изменять свои собственные данные учетной записи пользователя AD (правильно или неправильно). Мы берем данные из нашей системы управления персоналом и загружаем его в AD, а сотрудник - это ПК, поэтому он должен быть прав. – Guy 2008-11-10 22:31:46