Copia il file sul computer remoto utilizzando le credenziali di amministratore remoto

Sto usando C # …

Mi serve la possibilità di copiare un set di file su circa 500 computer unici. 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 come:

\\ ComputerRemoto \ C $ \ SomeFolder

Le mie domande sono … c’è un modo per farlo senza dover usare un account di dominio onnipotente (questi computer potrebbero non 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?

Correggimi se ho torto, ma puoi usare LogonUser per impersonare un gruppo locale e non solo account di dominio.

Dalla rete:

Imports System Imports System.Runtime.InteropServices Imports System.Security.Principal Imports System.Security.Permissions Public Class Form1  _ 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 

WNetAddConnection2 farà il trucco. Basta usare una stringa vuota per il nome del dispositivo locale, per evitare di mappare un’unità. Vuoi anche assicurarti di chiudere la connessione quando hai finito. Lo avvolgo in una class NetworkConnection che implementa IDisposable.