2009-04-19 21 views
10

Używam C# ...Skopiuj plik do komputera zdalnego przy użyciu zdalnych uprawnień administratora

Potrzebuję możliwości skopiowania zestawu plików do około 500 unikalnych komputerów. Udało mi się użyć metody LogonUser() do podszywania się pod konto domeny, które ma wymagane uprawnienia do kopiowania plików. Ścieżka docelowa dla plików jest coś takiego:

\\ komputer_zdalny \ c $ \ SomeFolder

Moje pytania jest ... czy jest jakiś sposób aby to zrobić bez konieczności korzystania wszechmocny domenę konto (te komputery mogą nie zostać dołączone do domeny w przyszłości)? Mam konta administratora lokalnego dla każdego komputera ... czy istnieje prosty sposób na skopiowanie pliku na komputer przy użyciu jego lokalnego konta administratora zamiast konta domeny?

Odpowiedz

7

Popraw mnie, jeśli się mylę, ale możesz użyć LogonUser do podszywania się pod lokalną grupę, nie tylko kont domeny.

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

Jesteś poprawne. Używałem innej wartości dla parametru logonType, który nie działał ... po zmianie na LOGON32_LOGON_NEW_CREDENTIALS działa jak mistrz! Dzięki! –

+1

Uważam, że działa to tylko wtedy, gdy hasło administratora jest takie samo na komputerze, na którym pracujesz, i na komputerze zdalnym. "Funkcja LogonUser próbuje zalogować użytkownika do komputera lokalnego Komputer lokalny to komputer, z którego wywołano LogonUser.Nie można używać LogonUser do logowania na komputerze zdalnym." –

+0

Dla powyższego kodu w funkcji LogOnUser należy podać nazwę lokalnego administratora jako nazwę użytkownika i lokalny komputer jako domenę i hasło jako hasło. Wszystkie te poświadczenia są docelową maszyną (lub serwerem). To zadziała. Wielkie dzięki! –

1

WNetAddConnection2 załatwi sprawę. Po prostu użyj pustego ciągu dla lokalnej nazwy urządzenia, aby uniknąć mapowania dysku. Po zakończeniu upewnij się też, że jest to wymagane i close the connection. Zawijam go do klasy NetworkConnection, która implementuje IDisposable.

Powiązane problemy