2009-04-19 8 views
10

ich C# bin mit ...Kopieren Sie die Datei auf Remote-Computer über Remote-Admin-Anmeldeinformationen

Ich brauche die Fähigkeit, eine Reihe von Dateien auf etwa 500 einzigartigen Computer zu kopieren. Ich war erfolgreich in der Lage, die LogonUser() - Methode zu verwenden, um ein Domänenkonto mit den erforderlichen Berechtigungen zum Kopieren der Dateien zu imitieren. Der Zielpfad für die Dateien sind so etwas wie:

\\ Remote \ C $ \ SomeFolder

Meine Fragen ist ... gibt es eine Möglichkeit, dies zu tun, ohne dass eine allmächtige Domain verwenden Konto (diese Computer dürfen in Zukunft nicht mehr mit der Domäne verbunden sein)? Ich habe die lokalen Administratorkonten für jeden Computer ... Gibt es eine einfache Möglichkeit, eine Datei mit einem LOCAL-Administratorkonto anstatt mit einem Domänenkonto auf einen Computer zu kopieren?

Antwort

7

Korrigieren Sie mich, wenn ich falsch liege, aber Sie können LogonUser verwenden, um eine lokale Gruppe auch nicht nur Domänenkonten zu imitieren.

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

Sie sind richtig. Ich habe einen anderen Wert für den Parameter logonType verwendet, der nicht funktionierte ... Sobald ich zu LOGON32_LOGON_NEW_CREDENTIALS gewechselt habe, funktioniert es wie ein Champion! Vielen Dank! –

+1

Ich glaube, das funktioniert nur, wenn das Administratorkennwort auf dem Computer, auf dem Sie ausgeführt werden, und auf dem Remotecomputer identisch ist. "Die LogonUser-Funktion versucht, einen Benutzer auf dem lokalen Computer zu protokollieren. Der lokale Computer ist der Computer, von dem LogonUser aufgerufen wurde. Sie können LogonUser nicht verwenden, um sich bei einem Remotecomputer anzumelden." –

+0

Geben Sie für den obigen Code in der LogOnUser-Funktion den Namen des lokalen Administrators als Benutzernamen und den Namen des lokalen Computers als Domäne und das Passwort als Passwort ein. Alle diese Anmeldeinformationen sind der Zielcomputer (oder Server). Es funktioniert. Danke vielmals! –

1

WNetAddConnection2 wird den Trick tun. Verwenden Sie einfach eine leere Zeichenfolge für den lokalen Gerätenamen, um die Zuordnung eines Laufwerks zu vermeiden. Sie wollen auch sicherstellen, und close the connection, wenn Sie fertig sind. Ich verpacke es in eine NetworkConnection-Klasse, die IDisposable implementiert.