2008-11-07 9 views
0

J'ai créé aC# webservice qui permet à nos équipes de support d'extrémité avant pour afficher et mettre à jour quelques valeurs Active Directory sélectionnées à l'aide System.DirectoryServicesCommentFaire - Définir délégué des privilèges Active Directory

Fields que je veux mettre à jour sont [ emploi] titre, département, téléphone et employé.

Je peux utiliser un compte de service avec des "droits de délégués" pour mettre à jour le titre, le département, le téléphone, etc. mais quand j'essaye de mettre à jour employeeid, j'obtiens un message d'erreur "non autorisé".

Si j'utilise un compte d'administrateur de domaine, le même code fonctionne correctement.

Je ne souhaite pas utiliser de compte administrateur de domaine pour ce service Web, alors de quels privilèges ai-je besoin?

Répondre

3

REPONSE

Le GUID ADS_SCHEMA_ID_GUID_USER vous permet de mettre à jour les détails de la classe d'utilisateur de base, y compris l'ID de l'employé

Based on MSDN article

Le vbscript utilisé pour accorder à l'utilisateur du compte de service des droits délégués sélectionnés

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

Un échantillon du code (les pièces mobiles au moins)

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 

(je vous présente mes excuses pour mon C#)

0

faire les utilisateurs de votre service ont le droit de modifier ces champs par les utilisateurs et ordinateurs? si elles sont alors peut-être vous pouvez utiliser l'usurpation d'identité et juste rendre votre ordinateur hôte de service "approuvé pour la délégation" (dans les propriétés AD pour cela) a toujours bien fonctionné pour moi.

+0

Non. Notre politique AD est que les utilisateurs ne peuvent pas modifier leurs propres informations de compte utilisateur AD (à tort ou à raison). Nous prenons les données de notre système de ressources humaines et les téléchargeons dans AD, et l'employé, c'est le PK, il doit donc être correct. – Guy

Questions connexes