[VB] Manipulation de fichier dans une appli via un compte utilisateur

Manipulation de fichier dans une appli via un compte utilisateur [VB] - C#/.NET managed - Programmation

Marsh Posté le 20-06-2007 à 14:13:59    

Bonjour,
 
je travail acutellement sur une appli qui va permettre de sauvegarder des fichiers utiles pour des automates (je ne gère que les fichiers, pas la programmation de ces fichiers).
L'appli doit être sur un serveur distant, donc contrôlé avec des rôles bien spécifiques.
 
Contenu de mon dossier:
appli.exe
appli.dll
bdd.mdb (protégé par un mot de passe à l'ouverture, contrôle des utilisateurs enregistrés pour l'appli & gestion de l'appli)
sauvegarde (dossier contenant les fichiers sauvegardés)
 
L'appli marche trés bien avec les droits actuels (lecture, écriture, modification, listage de dossier, parcours de dossier, suppression fichiers/dossiers), mais je souhaite pour des raisons de sécurité ne pas autoriser l'accés au dossier de sauvegarde via l'explorateur de windows.
 
Et là ca coince,  
Le droit "écriture" me permet bien de créer de nouveaux fichiers et dossiers, mais je ne peux plus les modifier, ni même les supprimer. Nous (moi et l'admin système) avons testé les différents droits possibles sur un utilisateur/groupe d'utilisateur, rien ne me conviens.
 
Je suis donc pour le moment à la recherche d'une manip pouvant permettre à mon appli de passer sous un autre utilisateur (qui lui aura les droits de lecture/écriture/modif/suppr/listage/parcours) pour enfin sauvegarder proprement mes fichiers.
 
Donc,  
Comment faire pour basculer de l'utilisateur courant vers un utilisateur avec pouvoir (droits bien spécifiques et personnalisés) dans mon appli ?
 
Merci pour votre aide.

Reply

Marsh Posté le 20-06-2007 à 14:13:59   

Reply

Marsh Posté le 20-06-2007 à 17:01:45    

Est-ce que le droit "Ecriture" tout seul (sans prendre le droit "Lister les fichiers" et "Lecture" ) n'est pas exactement ce que tu cherches à faire ?  
 
Tu peux copier des fichiers vers un répertoire (en Windows explorer via un drag and drop sur le répertoire et en ligne de commande sans passer par un "cd" sur le répertoire) sans pour autant en avoir droit de lecture ...

Reply

Marsh Posté le 20-06-2007 à 17:04:10    

http://msdn.microsoft.com/library/ [...] erting.asp
 
C'est trop incomplet pour moi, mais c'est ce que tu veux faire.
 
Ca permet à ton programme d'utiliser temporairement une autre identité.


Message édité par MagicBuzz le 20-06-2007 à 17:04:39
Reply

Marsh Posté le 20-06-2007 à 17:55:09    

Ecriture permet de créer de nouveaux fichiers et dossiers. C'est pas mal, mais j'ai aussi besoin du droit de modification (je renomme les fichiers temporairement avant de faire la sauvegarde). Hors le droit de modification active les droits de lecture de dossier, ce que je ne veux pas.
 
J'ai trouvé (juste avant de quitter le boulot, comme c'est pratique) les methodes pour downloader et uploader des fichiers, avec paramètres utilisateur et mot de passe (dans my.network). Manque de temps, je n'ai pas pu vérifier leur bon fonctionnement au sein de mon appli, mais ca me semble bien sympathique.
 
Réponse demain matin :)

Reply

Marsh Posté le 21-06-2007 à 09:21:27    

My.Computer.Network.UploadFile et DownloadFile marchent bien, mais j'ai encore un soucis puisque j'utilise le listing du dossier dans mon appli (et pour un test d'existence), et là ce n'est pas avec le bon utilisateur :(

Reply

Marsh Posté le 21-06-2007 à 12:52:59    

Me revoila, mais pour un autre problème, dans le genre bien chiant là

 

(j'essaye de mettre à jour une progressbar en utilisant un backgroundworker avec des info retournées par un formulaire différent dans sa méthode Load)
Une erreur s'est produite lors de la création du formulaire. Pour plus d'informations, consultez Exception.InnerException. L'erreur est : Le thread actuel doit être en mode STA (Single Thread Apartment) avant que des appels OLE puissent être effectués. Assurez-vous que votre fonction Main est marquée comme STAThreadAttribute.

 

Ca fait 3h que je fouille dans l'aide pour ne pas trouver une indication compréhensible
( http://msdn2.microsoft.com/fr-fr/l [...] S.80).aspx , http://msdn.microsoft.com/library/ [...] stopic.asp
)

 

[Edit] mon code:

 
Code :
  1. <STAThread()> _
  2.     Public Sub main()
  3.         Dim t As New Thread(AddressOf ThreadProc)
  4.         t.SetApartmentState(ApartmentState.STA)
  5.     End Sub
  6.     Private Sub ThreadProc(ByVal obj As Object)
  7.         obj.RunWorkerAsync()
  8.     End Sub
  9.     Private Sub OK_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OK_Button.Click
  10.         Try
  11.             [du code]
  12.             If [test] Then
  13.                
  14.                 form2.Show()
  15.                 me.Close
  16.             End If
  17.             [du code]
  18.        End Try
  19.     End Sub
  20.     Private Sub BackgroundWorkerLoading_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorkerLoading.DoWork
  21.         'chargement de l'interface
  22.         Gui_sauvegarde.Show()
  23.     End Sub
  24.     Private Sub BackgroundWorkerLoading_ProgressChanged(ByVal sender As System.Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorkerLoading.ProgressChanged
  25.         Me.ProgressBar1.Value = e.ProgressPercentage
  26.     End Sub
  27.     Private Sub BackgroundWorkerLoading_RunWorkerCompleted(ByVal sender As System.Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorkerLoading.RunWorkerCompleted
  28.         Me.ProgressBar1.Value = 0
  29.         SetText("Chargement terminé", Me.label_erreur)
  30.         SetForeColor(Color.Green, Me.label_erreur)
  31.         Me.Close()
  32.     End Sub
 

lol, j'y comprend rien et ca marche. Dés que j'appel form2.show, la barre de progression est bien "animée".
Avant le form2.show j'appelais la méthode ThreadProc(nomDuBackgroundWorker) mais sans succés oO

 

Désolé pour le dérangement ^^


Message édité par thana54 le 21-06-2007 à 13:40:01
Reply

Marsh Posté le 25-06-2007 à 15:34:47    

Retour sur le changement d'utilisateur, je rame depuis jeudi soir et n'avancement que trés lentement (je ne vois pas le bout de la chose :( )

 

J'obtiens ce vilain message d'erreur:
"Une erreur s'est produite lors de la création du formulaire. Pour plus d'informations, consultez Exception.InnerException. L'erreur est : Tentative de lecture ou d'écriture de mémoire protégée. Cela indique souvent qu'une autre mémoire est endommagée."

 

Mon code:

Code :
  1. Dim token As IntPtr = LogonUser(My.Settings.LOGIN & "@" & GetUserDomain(), ".", My.Settings.PASS, 3, 0, Security.Principal.WindowsIdentity.GetCurrent().Token)
  2. Dim ImpersonatedIdentity As New Security.Principal.WindowsIdentity(My.Settings.LOGIN & "@" & GetUserDomain())
  3. Dim MyImpersonation As Security.Principal.WindowsImpersonationContext
  4.  
  5. 'les méthodes de changement d'utilisateur
  6. Private Sub ChangeToken()
  7.        MyImpersonation = ImpersonatedIdentity.Impersonate()
  8.    End Sub
  9. Private Sub RestoreToken()
  10.        MyImpersonation.Undo()
  11.    End Sub
  12.  
  13. Function GetUserDomain() As String
  14.        If TypeOf My.User.CurrentPrincipal Is _
  15.        Security.Principal.WindowsPrincipal Then
  16.            ' My.User is using Windows authentication.
  17.            ' The name format is DOMAIN\USERNAME.
  18.            Dim parts() As String = Split(My.User.Name, "\" )
  19.            Dim domain As String = parts(0)
  20.            Return domain
  21.        Else
  22.            ' My.User is using custom authentication.
  23.            Return ""
  24.        End If
  25.    End Function
  26.  
  27. <DllImport("advapi32.dll", Entrypoint:="LogonUser" )> Public Shared Function LogonUser(ByVal lpszUsername As String, _
  28.        ByVal lpszDomain As String, _
  29.        ByVal lpszPassword As String, _
  30.        ByVal dwLogonType As Long, _
  31.        ByVal dwLogonProvider As Long, _
  32.        ByVal phToken As Long) As Long
  33.    End Function
 

Je n'arrive pas à intégrer à et utiliser advapi32.dll :( et sans cette dll je ne peux rien faire.
J'ai beau retourner le problème, utiliser DllImport ou Declare LogonUser lib "advapi32.dll" (...) toujours une erreur trés explicite m'attends au tournant.
 :fou: J'ai les nerfs à force.


Message édité par thana54 le 25-06-2007 à 15:35:21
Reply

Marsh Posté le 27-06-2007 à 09:19:29    

J'ai (enfin) trouvé un code qui ne me fait pas hériser les cheveux :)
 
(script pour asp codé en vb.net)
http://support.microsoft.com/kb/306158/fr
 

Code :
  1. <%@ Page Language="VB" %>
  2. <%@ Import Namespace = "System.Web" %>
  3. <%@ Import Namespace = "System.Web.Security" %>
  4. <%@ Import Namespace = "System.Security.Principal" %>
  5. <%@ Import Namespace = "System.Runtime.InteropServices" %>
  6. <script runat=server>
  7. Dim LOGON32_LOGON_INTERACTIVE As Integer  = 2
  8. Dim LOGON32_PROVIDER_DEFAULT As Integer = 0
  9. Dim impersonationContext As WindowsImpersonationContext
  10. Declare Auto Function LogonUser Lib "advapi32.dll" (ByVal lpszUsername As String, _
  11.                            ByVal lpszDomain As String, _
  12.                            ByVal lpszPassword As String, _
  13.                            ByVal dwLogonType As Integer, _
  14.                            ByVal dwLogonProvider As Integer, _
  15.                            ByRef phToken As IntPtr) As Integer
  16. Declare Auto Function DuplicateToken Lib "advapi32.dll" _
  17. (ByVal ExistingTokenHandle As IntPtr, _
  18.                            ImpersonationLevel As Integer, _
  19.                            ByRef DuplicateTokenHandle As IntPtr) As Integer
  20. Public Sub Page_Load(s As Object, e As EventArgs)
  21.    If impersonateValidUser("nomutilisateur", "domaine", "motdepasse" ) Then
  22.       'Insérez ici le code qui s'exécute dans le contexte de sécurité de l'utilisateur particulier.
  23.       undoImpersonation()
  24.    Else
  25.       'L'emprunt d'identité a échoué. Par conséquent, insérez ici un mécanisme de prévention de défaillance.
  26.    End If
  27. End Sub
  28. Private Function impersonateValidUser(userName As String, _
  29. domain As String, password As String) As Boolean
  30.    Dim tempWindowsIdentity As WindowsIdentity
  31.    Dim token As IntPtr
  32.    Dim tokenDuplicate As IntPtr
  33.    If LogonUser(userName, domain, password, LOGON32_LOGON_INTERACTIVE, _
  34.                 LOGON32_PROVIDER_DEFAULT, token) <> 0 Then
  35.       If DuplicateToken(token, 2, tokenDuplicate) <> 0 Then
  36.          tempWindowsIdentity = new WindowsIdentity(tokenDuplicate)
  37.          impersonationContext = tempWindowsIdentity.Impersonate()
  38.             If impersonationContext Is Nothing Then
  39.                impersonateValidUser = False
  40.             Else
  41.                impersonateValidUser = True
  42.             End If
  43.       Else
  44.          impersonateValidUser = False
  45.       End If
  46.    Else
  47.       impersonateValidUser = False
  48.    End If
  49. End Function
  50. Private Sub undoImpersonation()
  51.    impersonationContext.Undo()
  52. End Sub
  53. </script>


 
Cela dis je ne comprend pas pourquoi mon code ne marchais pas, il ressemblais beaucoup à celui là  :heink:

Reply

Marsh Posté le 03-07-2007 à 14:06:49    

Me revoila toujours vivant (pas pour longtemps), mais voici mon nouveau problème (toujours lié à la manipulation de fichiers en utilisant un autre compte utilisateur):
 
Impossiblité de créer de dossier dans un dossier où l'utilisateur dispose du contrôle total (je résume d'aprés toutes mes déductions). Pas mal hein ? :D  :cry:  
 
Fait étrange l'appli se comporte bien quand je ne change pas d'identité lors de la manipulation de mes fichiers.
Autre fait (super) étrange, mon appli marche sans aucun problème en local avec changement d'utilisateur... :heink:  
 
L'attribution des droits sur un objet DirectoryInfo se passe bien, je peux changer de propriétaire, ajouter, modifier et supprimer des droits, mais ca coince quand je veux créer le dossier.
 
Que ca soit par dossier.create ou par dossier_parent.CreateSubdirectory ca ne marche pas (en passant ou non la DirecotrySecurity)
 
Mon ultime solution, essayer de débloquer tout les droits lors de la manipulation des fichiers pour l'utilisateur ayant lancé l'application...
 
Mon tuteur m'a dis qu'il n'y aurais que trés peu de personnes autorisées, mais je vois mal une appli sécurisée laisser un controle total sur ses données  :pfff:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed