2009-04-19 9 views
10

Sto utilizzando C# ...Copia file sul computer remoto utilizzando credenziali di amministratore remote

Ho bisogno della possibilità di copiare un set di file su circa 500 computer univoci. Sono riuscito a utilizzare correttamente il metodo LogonUser() per impersonare un account di dominio con le autorizzazioni necessarie per copiare i file. Il percorso di destinazione per i file è qualcosa di simile:

\\ ComputerRemoto \ C $ \ SomeFolder

Le mie domande è ... c'è un modo per farlo senza dover utilizzare un onnipotente dominio account (questi computer non possono essere aggiunti al dominio in futuro)? Ho gli account degli amministratori locali per ogni computer ... c'è un modo semplice per copiare un file su un computer usando il suo account amministratore LOCAL piuttosto che un account di dominio?

risposta

7

Correggetemi se ho torto, ma è possibile utilizzare LogonUser per impersonare un gruppo locale e non solo account di dominio.

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

lei ha ragione. Stavo usando un valore diverso per il parametro logonType che non funzionava ... una volta passato a LOGON32_LOGON_NEW_CREDENTIALS funziona come un campione! Grazie! –

+1

Credo che funzioni solo se la password dell'amministratore è la stessa sul computer su cui si sta lavorando e sul computer remoto. "La funzione LogonUser tenta di accedere a un utente sul computer locale.Il computer locale è il computer da cui è stato chiamato LogonUser. Non è possibile utilizzare LogonUser per accedere a un computer remoto." –

+0

Per il codice precedente, nella funzione LogOnUser fornire il nome dell'amministratore locale come nome utente e nome computer locale come dominio e password come password. Tutte queste credenziali sono la macchina di destinazione (o server). Funzionerà. Molte grazie! –

1

WNetAddConnection2 farà il trucco. Basta usare una stringa vuota per il nome del dispositivo locale, per evitare di mappare un'unità. Quando hai finito, vuoi anche assicurarti e close the connection. Lo avvolgo in una classe NetworkConnection che implementa IDisposable.