Problème d'accès à un volume distant

Signaler
Messages postés
43
Date d'inscription
lundi 17 octobre 2005
Statut
Membre
Dernière intervention
7 mai 2010
-
Messages postés
43
Date d'inscription
lundi 17 octobre 2005
Statut
Membre
Dernière intervention
7 mai 2010
-
Bonjour,

J'essaie de manipuler des fichiers sur un volume distant.
Ce dossier est sur un volume NFS
Mais cela ne fonctionne pas à cause d'un problème de droits.

J'ai lu que l'impersonation devrait permettre de le faire
j'ai essayé le code

publicenum LogonType : int{
               LOGON32_LOGON_INTERACTIVE =     2,
               LOGON32_LOGON_NETWORK = 3,
               LOGON32_LOGON_BATCH = 4,
               LOGON32_LOGON_SERVICE = 5,
               LOGON32_LOGON_UNLOCK = 7,
               LOGON32_LOGON_NETWORK_CLEARTEXT = 8,   
               LOGON32_LOGON_NEW_CREDENTIALS = 9      
       };
 
       publicenum LogonProvider : int{
               LOGON32_PROVIDER_DEFAULT = 0,
               LOGON32_PROVIDER_WINNT35 = 1,
               LOGON32_PROVIDER_WINNT40 = 2,
               LOGON32_PROVIDER_WINNT50 = 3
       };
 
       class SecuUtil32 {
               [DllImport("advapi32.dll", SetLastError=true)]
               publicstaticexternbool LogonUser(String lpszUsername,
                       String lpszDomain, String lpszPassword,
                       int dwLogonType, int dwLogonProvider, ref IntPtr TokenHandle);
 
               [DllImport("kernel32.dll", CharSet=CharSet.Auto)]
               publicexternstaticbool CloseHandle(IntPtr handle);
 
               [DllImport("advapi32.dll", CharSet=CharSet.Auto, SetLastError=true)]
              
               publicexternstaticbool DuplicateToken(IntPtr  ExistingTokenHandle, int SECURITY_IMPERSONATION_LEVEL,
                ref IntPtr DuplicateTokenHandle);
       }
      publicclass NetworkSecurity {
 
               public NetworkSecurity(){
                }
     
               publicstatic WindowsImpersonationContext ImpersonateUser  
               (string strDomain, string strLogin,string strPwd,LogonType 
                       logonType, LogonProvider logonProvider){
                       IntPtr tokenHandle = new IntPtr(0);
                       IntPtr dupeTokenHandle = new IntPtr(0);
                       try{
                               constint SecurityImpersonation = 2;
     
                               tokenHandle = IntPtr.Zero;
                               dupeTokenHandle = IntPtr.Zero;
                               bool returnValue = SecuUtil32.LogonUser(
                                       strLogin,
                                       strDomain,
                                       strPwd,
                                       (int)logonType,
                                       (int)logonProvider,
                                       ref tokenHandle);
                               if(returnValue == false)  {
                                       int ret = Marshal.GetLastWin32Error();
                                       string strErr = String.Format("LogonUser failed with error code : {0}", ret);
                                       thrownew ApplicationException(strErr, null);
                               }
 
                               bool retVal = SecuUtil32.DuplicateToken(tokenHandle,
                               SecurityImpersonation, ref dupeTokenHandle);                               if(false retVal false){
                                       SecuUtil32.CloseHandle(tokenHandle);
                                       thrownew ApplicationException(
                                         "Failed to duplicate token", null);
                               }
 
                                WindowsIdentity newId = new WindowsIdentity
                                   (dupeTokenHandle);
                               WindowsImpersonationContext impersonatedUser =
                                  newId.Impersonate();
 
                               return impersonatedUser;
                       }catch(Exception ex){
                               thrownew ApplicationException(ex.Message, ex);
                       }
               }
       }
 

 
<!-- END TEMPLATE: bbcode_code -->que j'appelle avec :
WindowsImpersonationContext impContext;
    impContext = null;
    try
    {impContext = NetworkSecurity.ImpersonateUser("",
                "login", "motdepasse",
                LogonType.LOGON32_LOGON_NETWORK, LogonProvider.LOGON32_PROVIDER_DEFAULT);
   }
    catch(ApplicationException ex)
    {
    }
    if(impContext != null)
    {
        try
        {foreach(string files in Directory.GetFiles(@"X:", "*.pdf", SearchOption.TopDirectoryOnly))
            {
                NomFichierFacture = files;
            }
        }
        catch(Exception ex)
        {
        }
        impContext.Undo();
    }
 <!-- END TEMPLATE: bbcode_code -->Quel que soit le login et mot de passe que je rentre (correct ou incorrect j'ai toujours l'erreur "Failed to duplicate token"

Je ne sais pas comment marche l'impersonation, donc je ne vois pas quel est le problème.

Si quelqu'un peut m'aider

Merci d'avance.<!-- / message -->

1 réponse

Messages postés
43
Date d'inscription
lundi 17 octobre 2005
Statut
Membre
Dernière intervention
7 mai 2010

j'ai corrigéla partie  if(false retVal false)
je n'ai plus l'erreur "fail to duplicate token" ,j'essaie d'atteindre le volume X mais j'ai l'erreur

"Impossible de trouver une partie du chemin d'accès 'X:\'."

Le changement d'utilisateur n'a pas fonctionné