2010-07-07 8 views
0

Quand j'utilise:Comment copier un fichier à partir d'un ordinateur nécessitant une authentification sur mon ordinateur local?

File.Copy(strRemoteFolder, strLocalFolder) 

je reçois un UnauthorizedAccessException avec le message suivant: « L'accès au chemin ... est refusé. »

Dans .NET, comment copier un fichier à partir d'un ordinateur distant nécessitant une authentification sur mon ordinateur local? Je comprends que je vais devoir fournir un nom d'utilisateur et un mot de passe, mais je ne sais pas comment fournir ces informations via une API dans .NET.

+0

Ci-dessous vous notez que vous avez différents domaines et ne pouvez pas fournir d'informations d'identification inter-domaines. Avez-vous le contrôle du PC distant? –

+0

@Tim nous avons le contrôle sur le PC distant, mais je crois que pour des raisons de sécurité, nous ne serons pas en mesure de créer une politique qui permet l'accès interdomaines. –

Répondre

0

Ajustez les privilèges de partage sur le système cible pour autoriser l'accès.

+0

J'ai spécifiquement besoin d'une solution dans .NET. La machine cible est sur un domaine différent et nous sommes incapables de fournir des informations d'identification sur différents domaines. –

+0

qui n'invalide pas la réponse. sinon, vous pourriez simplement écrire un programme et obtenir des données protégées de n'importe quelle autre machine. pas susceptible de se produire. – Randy

0

Vous ne serez pas en mesure de copier des fichiers à partir d'un serveur protégé sans vous authentifier.

1

Vous pouvez utiliser la fonction LogonUser non géré pour obtenir un jeton de compte pour une session sur la machine distante, puis appelez WindowsIdentity.Impersonate d'utiliser cette session. La page MSDN sur WindowsIdentity.Impersonate décrit comment faire l'appel p/invoke à LogonUser.

Vous ne pourrez probablement pas utiliser File.Copy car vous n'aurez pas accès à la machine locale, mais vous pouvez appeler File.OpenRead pour ouvrir le fichier distant, puis rétablir votre jeton. Quelque chose comme ceci:

[DllImport("advapi32.dll")] 
public static extern bool LogonUser(string lpszUsername, string lpszDomain, string lpszPassword, int dwLogonType, int dwLogonProvider, out IntPtr phToken); 
[DllImport("kernel32.dll")] 
public static extern bool CloseHandle(IntPtr hObject); 

public static Stream OpenFileWithAccount(string filename, string username, string domain, string password) 
{ 
    IntPtr token; 
    if (!LogonUser(username, domain, password, 2, 0, out token)) 
    { 
     throw new Win32Exception(); 
    } 
    try 
    { 
     using (WindowsIdentity.Impersonate(token)) 
     { 
      return File.OpenRead(filename); 
     } 
    } 
    finally 
    { 
     CloseHandle(token); 
    } 
} 
+0

Peut-être avez-vous les arguments à l'appel de la méthode dans le mauvais ordre? -> (nom d'utilisateur, domaine, mot de passe ...) comme dans la déclaration – MaLio

+1

@MaLio: Vous avez raison, je l'ai fait. Merci pour la capture! – Quartermeister

+0

Où est la mauvaise commande? Je ne peux pas trouver ça. Aidez moi. J'ai eu une erreur lors de l'appel de la méthode LogUser. – AT07

1

Les suggestions d'utiliser LogonUser pour ouvrir une session sur l'ordinateur distant est définitivement faux. Vous devez utiliser WNetAddConnection2 ou NetUseAdd avec l'API native de niveau de paramètre 2 (USE_INFO_2) pour établir une connexion à distance.

0

Étant donné que vous avez le contrôle sur les deux machines, vous pouvez créer un utilisateur local sur les deux machines avec des mots de passe correspondants, puis exécuter le programme en tant qu'utilisateur.

Ou vous pouvez simplement créer l'utilisateur sur la machine distante et mapper un lecteur à cet ordinateur en utilisant le nom d'utilisateur/mot de passe de cet utilisateur. Vous devez spécifier l'utilisateur en tant que RemoteServer\NewUser. Donc, vous les paramètres à utiliser net comme référencé here serait use s: \\remoteserver\share /USER:RemoteServer\NewUser password. Ensuite, appeler net à nouveau, mais passer use s: /delete pour nettoyer ...

(L'hypothèse est ici que vous avez correctement configuré l'utilisateur d'avoir accès au partage/dossier en question.)

Questions connexes