Copie el archivo a una computadora remota usando credenciales de administración remota

Estoy usando C # …

Necesito la capacidad de copiar un conjunto de archivos a aproximadamente 500 computadoras únicas. He podido usar con éxito el método LogonUser () para suplantar una cuenta de dominio que tiene los permisos necesarios para copiar los archivos. La ruta de destino para los archivos es algo así como:

\\ RemoteComputer \ C $ \ SomeFolder

Mi pregunta es … ¿hay alguna forma de hacer esto sin tener que usar una cuenta de dominio todopoderosa (estas computadoras pueden no estar unidas al dominio en el futuro)? Tengo las cuentas de administrador local para cada computadora … ¿hay una manera simple de copiar un archivo a una computadora usando su cuenta de administrador LOCAL en lugar de una cuenta de dominio?

Corrígeme si me equivoco, pero puedes usar LogonUser para suplantar a un grupo local y no solo cuentas de dominio.

De la red:

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 hará el truco. Simplemente use una cadena vacía para el nombre del dispositivo local, para evitar mapear una unidad. También debe asegurarse y cerrar la conexión cuando haya terminado. Lo envuelvo en una clase NetworkConnection que implementa IDisposable.