2009-04-19 13 views
10

J'utilise C# ...Copier le fichier sur l'ordinateur distant à l'aide des informations d'identification de l'administrateur distant

J'ai besoin de la possibilité de copier un ensemble de fichiers sur environ 500 ordinateurs uniques. J'ai réussi à utiliser la méthode LogonUser() pour emprunter l'identité d'un compte de domaine disposant des autorisations requises pour copier les fichiers. Le chemin de destination pour les fichiers est quelque chose comme:

\\ OrdinateurDistant \ C $ \ unDossier

Ma question est ... est-il un moyen de le faire sans avoir à utiliser un domaine tout-puissant compte (ces ordinateurs ne peuvent pas être joints au domaine dans le futur)? J'ai les comptes administrateur local pour chaque ordinateur ... existe-t-il un moyen simple de copier un fichier sur un ordinateur en utilisant son compte d'administrateur LOCAL plutôt qu'un compte de domaine?

Répondre

7

Corrigez-moi si je me trompe, mais vous pouvez utiliser LogonUser pour emprunter l'identité d'un groupe local et pas seulement les comptes de domaine.

From the net:

Imports System 
Imports System.Runtime.InteropServices 
Imports System.Security.Principal 
Imports System.Security.Permissions 
Public Class Form1 
    <DllImport("advapi32.DLL", SetLastError:=True)> _ 
    Public Shared Function LogonUser(ByVal lpszUsername As String, ByVal lpszDomain As String, _ 
     ByVal lpszPassword As String, ByVal dwLogonType As Integer, ByVal dwLogonProvider As Integer, _ 
     ByRef phToken As IntPtr) As Integer 
    End Function 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
     Dim admin_token As IntPtr 
     Dim wid_current As WindowsIdentity = WindowsIdentity.GetCurrent() 
     Dim wid_admin As WindowsIdentity = Nothing 
     Dim wic As WindowsImpersonationContext = Nothing 
     Try 
      MessageBox.Show("Copying file...") 
      If LogonUser("Local Admin name", "Local computer name", "pwd", 9, 0, admin_token) <> 0 Then 
       wid_admin = New WindowsIdentity(admin_token) 
       wic = wid_admin.Impersonate() 
       System.IO.File.Copy("C:\right.bmp", "\\157.60.113.28\testnew\right.bmp", True) 
       MessageBox.Show("Copy succeeded") 
      Else 
       MessageBox.Show("Copy Failed") 
      End If 
     Catch se As System.Exception 
      Dim ret As Integer = Marshal.GetLastWin32Error() 
      MessageBox.Show(ret.ToString(), "Error code: " + ret.ToString()) 
      MessageBox.Show(se.Message) 
     Finally 
      If wic IsNot Nothing Then 
       wic.Undo() 
      End If 
     End Try 
    End Sub 
End Class 
+1

Vous avez raison. J'utilisais une valeur différente pour le paramètre logonType qui ne fonctionnait pas ... une fois que je suis passé à LOGON32_LOGON_NEW_CREDENTIALS cela fonctionne comme un champion! Merci! –

+1

Je crois que cela ne fonctionne que si le mot de passe d'administrateur est le même sur l'ordinateur que vous utilisez et sur l'ordinateur distant. "La fonction LogonUser tente de connecter un utilisateur sur l'ordinateur local.L'ordinateur local est l'ordinateur à partir duquel LogonUser a été appelé.Vous ne pouvez pas utiliser LogonUser pour vous connecter à un ordinateur distant." –

+0

Pour le code ci-dessus, dans LogOnUser Function, indiquez le nom de l'administrateur local en tant que nom d'utilisateur et le nom de l'ordinateur local en tant que domaine et mot de passe en tant que mot de passe. Toutes ces informations d'identification sont la machine de destination (ou serveur). Cela fonctionnera. Merci beaucoup! –

1

WNetAddConnection2 fera l'affaire. Utilisez simplement une chaîne vide pour le nom du périphérique local afin d'éviter de mapper un lecteur. Vous voulez également vous assurer et close the connection lorsque vous avez terminé. Je l'enveloppe dans une classe NetworkConnection qui implémente IDisposable.

Questions connexes