J'ai développé une application qui tournera sur des poste dont les utilisateurs sont logués sur l'Active Directory.
Cette application doit écrire dans des fichiers qui sont dans un dossier du réseau dont les droits d'accès sont exclusivement réservés à un compte administrateur de l'AD que j'appelerais pour l'exemple "Alone".
Je souhaiterais donc que mon appli soit reconnue dans l'AD comme étant "Alone" et donc autorisée à y accéder mais pas les utilisateurs logués sur la session.
J'ai lu bon nombre d'exemples sur l'AD. Mais je ne vois pas quel stratégie adopter pour que mon appli soit reconnue comme étant "Alone"
J'ai créé un dossier uniquement accessible à un compte admin de l'AD: NameSearch , cela fonctionne bien.
Pour l'authentification sur l'AD, cela fonctionne bien aussi.
Public Function FindAccountAD() As Boolean
Try ' connection à l'active directory Dim Entry As DirectoryEntry Dim NaneSearch As String = My.Application.Info.AssemblyName Entry = New DirectoryServices.DirectoryEntry(LdapLink)
Dim Searcher As New DirectorySearcher(Entry) Searcher.Filter = "(objectClass=user)"
Dim DirEntry As DirectoryEntry
For Each result As SearchResult In Searcher.FindAll ' // On récupère l'entrée trouvée lors de la recherche DirEntry = result.GetDirectoryEntry If NameSearch = DirEntry.Properties("SAMAccountName").Value Then WriteAudit(Date.Now & "; Connexion à l'AD réussie" & " ; " & UCase(Username)) Application.DoEvents() If AuthenticateUser(LdapLink, NameSearch , Pass) Then WriteAudit(Date.Now & "; Authentification à l'AD réussie" & " ; " & UCase(Login)) Return True End If
End If Next Return False
Catch ex As Exception WriteLog(Date.Now & " ; Erreur d'éxecution ; " & System.Reflection.MethodBase.GetCurrentMethod().Name & " ; " & ex.Message) 'MessageBox.Show(ex.Message) Return False End Try End Function
Function AuthenticateUser(ByVal path As String, ByVal user As String, ByVal pass As String) As Boolean Dim de As New DirectoryEntry(path, user, pass, AuthenticationTypes.Secure) Try 'run a search using those credentials. 'If it returns anything, then you're authenticated Dim ds As DirectorySearcher = New DirectorySearcher(de) ds.FindOne() Return True
Catch ex As Exception WriteLog(Date.Now & " ; Erreur d'éxecution ; " & System.Reflection.MethodBase.GetCurrentMethod().Name & " ; " & ex.Message) Return False End Try End Function
puis pour la creation du nouveau dossier:
'Creation du dossier (uniquement accessible à "NameSearch ") If Not System.IO.Directory.Exists(FolderSaveLink) Then System.IO.Directory.CreateDirectory(FolderSaveLink) End If
Et c'est donc dans cette création que ça plante, accés refusé.
Je voudrais comprendre comment la demande d'ecriture ci- dessus dans le dossier peut étre reconnue pas l'AD comme ayant les autorisations du compte "NameSearch"
La question est restée sans réponse sur le forum, et ayant trouvé une solution qui fonctionne bien, je la partage.
Pour rappel, l'idée était de démarrer une application avec un compte spécifique (autre que celui de la seesion Windows)qui est le seul à avoir des droits d'écriture sur un dossier.
Pour ce faire, il a suffit de simuler la fonction du "Démarrer en tant que"... avec ce compte spécifique.
Public Sub RunAsApp(ByVal Login as string, ByVal Pwd as string, ByVal Domaine as string) Try Dim password As New SecureString() Dim c As Char For Each c In Pwd password.AppendChar(c) Next c Dim path As String = My.Application.Info.DirectoryPath & "" 'Chemin de l'exe Process.Start(path & "MonAppli.exe", Login, password, Domaine) Me.Dispose() Catch ex As Exception MessageBox.Show(ex.Message) End Try
Personnellement, j'ai créé un autre exe avec un Form invisible qui lance, avec ce code, l'exécutable "en tant que" le compte de l'AD que je souhaite.
Pour info, le compte avec lequel vous êtes loggué sur votre session Windows doit bien sur être connue de l'AD.