Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Service et activeDirectory

7 réponses
Avatar
MrChris
Salut !

J'ai programmé un service et un client.
Le service démarre avec le compte SYSTEM.
Le client démarre avec le compte utilisateur (enfin je crois, c'est un exe
tout ce qu'il y a de plus classique)
Ce service écoute par un socket les clients.
Il est prévu que le client puisse demander au service d'écrire dans
l'ActiveDirectory, et c'est
cette fonctionalité qui ne marche pas correctement :

Quand le client est lancé par un admin, pas de problème.
Quand le client est lancé par un utilisateur du domaine le service génère
une exception
qui dit qu'il ne peut pas écrire dans l'ActiveDirectory à cause d'un
problème de droit.

Ce que je ne comprend pas, c'est que c'est le service qui écrit dans
l'ActiveDirectory, donc le compte
SYSTEM, quelque soit l'utilisateur qui utilise le client.

Alors pourquoi ca fonctionne quand le client est lancé par un admin et pas
quand il est lancé par un utilisateur du domaine ??? (c'est un truc de fous
ça non ?!?)

Merci pour votre coup de pouce !

Au cas où, voici l'exception :
System.UnauthorizedAccessException: Erreur d'accès général refusé
at System.DirectoryServices.Interop.IAds.SetInfo()
at System.DirectoryServices.DirectoryEntry.CommitChanges()
at SocketAsyncServerLib.LDAPClass.SetTel(String User, String Tel)

MrChris

7 réponses

Avatar
Jonathan Bismuth
Pas facile de répondre sans voir le code derrière...

Je dirai qu'il y a un problème d'impersonalisation et que le service utilise
les credentials du client et non le compte systeme
as tu essayé d'implémenter ce genre de trucs :
http://support.microsoft.com/kb/306158 (pour ASP.net et C# mais je penses
que ça dois pouvoir s'étendre ailleurs)


@+
--

Jonathan BISMUTH
MCSE (W2K) 2272252
Beta ID 570978
WSH/Batch Scripter
http://www.supinfo-projects.com/fr/authors/?a=Cyber_Hunter
pour me contacter http://cerbermail.com/?z5pCI2OyS6

"MrChris" a écrit dans le message de news:

Salut !

J'ai programmé un service et un client.
Le service démarre avec le compte SYSTEM.
Le client démarre avec le compte utilisateur (enfin je crois, c'est un exe
tout ce qu'il y a de plus classique)
Ce service écoute par un socket les clients.
Il est prévu que le client puisse demander au service d'écrire dans
l'ActiveDirectory, et c'est
cette fonctionalité qui ne marche pas correctement :

Quand le client est lancé par un admin, pas de problème.
Quand le client est lancé par un utilisateur du domaine le service génère
une exception
qui dit qu'il ne peut pas écrire dans l'ActiveDirectory à cause d'un
problème de droit.

Ce que je ne comprend pas, c'est que c'est le service qui écrit dans
l'ActiveDirectory, donc le compte
SYSTEM, quelque soit l'utilisateur qui utilise le client.

Alors pourquoi ca fonctionne quand le client est lancé par un admin et pas
quand il est lancé par un utilisateur du domaine ??? (c'est un truc de
fous

ça non ?!?)

Merci pour votre coup de pouce !

Au cas où, voici l'exception :
System.UnauthorizedAccessException: Erreur d'accès général refusé
at System.DirectoryServices.Interop.IAds.SetInfo()
at System.DirectoryServices.DirectoryEntry.CommitChanges()
at SocketAsyncServerLib.LDAPClass.SetTel(String User, String Tel)

MrChris




Avatar
MrChris
Voici au cas où la partie du code qui essaye d'écrire dans la LDAP.
Le service recoit les commandes par une programmation socket TCP tout
ce qu'il y a de plus classique (en asynchrone).
Et le service démarre avec le compte system.
Je n'ai pas essayé de faire d'impersonation dans le code du service ni du
client...

Public Function SetTel(ByVal User As String, ByVal Tel As String) As Boolean
Try
Dim result As Boolean = False
Dim objSearch As New DirectorySearcher
Dim colQueryResults As SearchResultCollection
objSearch.CacheResults = False
objSearch.SearchRoot = New
DirectoryEntry("LDAP://ou=MonOUdeUser,dc=MyDomaineName,dc=com")
objSearch.SearchScope = SearchScope.Subtree
objSearch.Filter = "(&(objectClass=user)(|(name=" & User & ")))"
colQueryResults = objSearch.FindAll()
If colQueryResults.Count > 0 Then
Dim objWrite As New DirectoryEntry(colQueryResults.Item(0).Path)
'objWrite.UsePropertyCache = False
objWrite.Properties("telephonenumber").Value = Tel
objWrite.CommitChanges()
objWrite.RefreshCache()
result = True
End If
Return result
Catch ex As Exception
RaiseEvent Message(Date.Now, "Serveur", "LDAPClass.SetTel", "Le
Service ServicePostIt a générer une erreur: " & ex.Message & vbCrLf & " dans
le module : Settel de LDAPClass", 1, True)
Return False
End Try
End Function

Donc en toute logique, pour moi en tout cas, c'est SYSTEM qui écrit dans la
LDAP.
Je ne sais pas du tout ce que veut dire : "les credentials du client" mais
le client
s'exécute sur une machine distante, et je ne vois aucune raison pour qu'il
utilise un autre
compte que system. Mais je ne m'y connait pas assez pour le confirmer.

Merci pour ce lien très instructif.
@+MrChris
Avatar
Jonathan Bismuth
"les credentials du client" , en français les identifiants (désolé) donc
login / mot de passe.

perso je penses que tu devrais essayer d'utiliser le compte administrateur
pour démarrer le service (temporairement) afin de voir si le problème se
repose. Si oui ,c'est donc logiquement un problème "d'impersonate", que tu
n'as plus qu'à ajouter.

Je sais par exemple que ça m'est déjà arrivé lorsque je voulais permettre à
un utilisateur de modifier des attributs AD depuis une page web sous
asp.net.
J'ai été obligé de bidouiller ça par "l'impersonate".

++
--
Jonathan BISMUTH
MCSE (W2K) 2272252
Beta ID 570978
WSH/Batch Scripter
http://www.supinfo-projects.com/fr/authors/?a=Cyber_Hunter
pour me contacter http://cerbermail.com/?z5pCI2OyS6

"MrChris" a écrit dans le message de news:
#
Voici au cas où la partie du code qui essaye d'écrire dans la LDAP.
Le service recoit les commandes par une programmation socket TCP tout
ce qu'il y a de plus classique (en asynchrone).
Et le service démarre avec le compte system.
Je n'ai pas essayé de faire d'impersonation dans le code du service ni du
client...

Public Function SetTel(ByVal User As String, ByVal Tel As String) As
Boolean

Try
Dim result As Boolean = False
Dim objSearch As New DirectorySearcher
Dim colQueryResults As SearchResultCollection
objSearch.CacheResults = False
objSearch.SearchRoot = New
DirectoryEntry("LDAP://ou=MonOUdeUser,dc=MyDomaineName,dc=com")
objSearch.SearchScope = SearchScope.Subtree
objSearch.Filter = "(&(objectClass=user)(|(name=" & User & ")))"
colQueryResults = objSearch.FindAll()
If colQueryResults.Count > 0 Then
Dim objWrite As New
DirectoryEntry(colQueryResults.Item(0).Path)

'objWrite.UsePropertyCache = False
objWrite.Properties("telephonenumber").Value = Tel
objWrite.CommitChanges()
objWrite.RefreshCache()
result = True
End If
Return result
Catch ex As Exception
RaiseEvent Message(Date.Now, "Serveur", "LDAPClass.SetTel", "Le
Service ServicePostIt a générer une erreur: " & ex.Message & vbCrLf & "
dans

le module : Settel de LDAPClass", 1, True)
Return False
End Try
End Function

Donc en toute logique, pour moi en tout cas, c'est SYSTEM qui écrit dans
la

LDAP.
Je ne sais pas du tout ce que veut dire : "les credentials du client" mais
le client
s'exécute sur une machine distante, et je ne vois aucune raison pour qu'il
utilise un autre
compte que system. Mais je ne m'y connait pas assez pour le confirmer.

Merci pour ce lien très instructif.
@+MrChris




Avatar
MrChris
Ok, je lance temporairement en admin et je te tient au courant !

Merci Beaucoup pour ce post !

@+MrChris
Avatar
MrChris
Bon, j'ai rajouté dans le service avant d'écrire dans la LDAP un
environment.username.
A chaque fois c'est SYSTEM qui apparait !
Par Contre maintenant, quelque soit l'utilisateur, le service ne peut pas
écrire dans l'AD.

Comment faire pour donner les autorisations à SYSTEM pour écrire dans l'AD
???

Merci
Avatar
Jonathan Bismuth
tu spécifie (dans services.msc, onglet connexions) quel compte sous lequel
démarrer le service,[ je ne parle pas d'un environment.username]?
--
Jonathan BISMUTH
MCSE (W2K) 2272252
Beta ID 570978
WSH/Batch Scripter
http://www.supinfo-projects.com/fr/authors/?a=Cyber_Hunter
pour me contacter http://cerbermail.com/?z5pCI2OyS6

"MrChris" a écrit dans le message de news:

Bon, j'ai rajouté dans le service avant d'écrire dans la LDAP un
environment.username.
A chaque fois c'est SYSTEM qui apparait !
Par Contre maintenant, quelque soit l'utilisateur, le service ne peut pas
écrire dans l'AD.

Comment faire pour donner les autorisations à SYSTEM pour écrire dans l'AD
???

Merci




Avatar
MrChris
Ok, mais pour moi c'est bien que ce soit system qui fasse tourner le
service, car à chaque fois
qu'on change le mot de passe admin, il faut le faire pour tout les services
qui démarrent avec ce compte.

Sinon, d'après un post, on peut se connecter à l'active directory par
programmation en spécifiant
l'utilisateur, je vais plutôt gratter dans ce sens !

Merci beaucoup !
@+MrChris