2009-04-19 11 views
10

estoy usando C# ...copiar el archivo al equipo remoto usando las credenciales de administración remota

necesito la posibilidad de copiar un conjunto de archivos a unos 500 ordenadores únicos. 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 como:

\\ equipoRemoto \ C $ \ SomeFolder

Mis preguntas se ... ¿hay alguna manera de hacer esto sin tener que utilizar un dominio omnipotente cuenta (¿estas computadoras no se pueden unir 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?

Respuesta

7

Corrígeme si me equivoco, pero puede usar LogonUser para suplantar un grupo local y no solo cuentas de 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

estás en lo correcto. Estaba usando un valor diferente para el parámetro logonType que no funcionaba ... ¡una vez que cambié a LOGON32_LOGON_NEW_CREDENTIALS funciona como un campeón! ¡Gracias! –

+1

Creo que esto solo funciona si la contraseña de administrador es la misma en la computadora en la que se está ejecutando y en la computadora remota. "La función LogonUser intenta registrar a un usuario en la computadora local. La computadora local es la computadora desde la que se llamó a LogonUser. No puede usar LogonUser para iniciar sesión en una computadora remota". –

+0

Para el código anterior, en la función LogOnUser, proporcione el nombre de administrador local como nombre de usuario y nombre de equipo local como dominio y contraseña como contraseña. Todas estas credenciales son la máquina de destino (o servidor). Funcionará. ¡Muchas gracias! –

1

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 close the connection cuando haya terminado. Lo envuelvo en una clase NetworkConnection que implementa IDisposable.

Cuestiones relacionadas