Скопируйте файл на удаленный компьютер, используя учетные данные удаленного администратора - PullRequest
11 голосов
/ 20 апреля 2009

Я использую C # ...

Мне нужна возможность скопировать набор файлов примерно на 500 уникальных компьютеров. Я успешно смог использовать метод LogonUser () для олицетворения учетной записи домена, которая имеет необходимые разрешения для копирования файлов. Путь назначения для файлов выглядит примерно так:

\\ удаленный_компьютер \ C $ \ SomeFolder

Мои вопросы ... есть ли способ сделать это, не используя всесильную учетную запись домена (эти компьютеры могут не присоединиться к домену в будущем)? У меня есть учетные записи локального администратора для каждого компьютера ... Есть ли простой способ скопировать файл на компьютер, используя его локальную учетную запись администратора, а не учетную запись домена?

Ответы [ 2 ]

7 голосов
/ 20 апреля 2009

Поправьте меня, если я ошибаюсь, но вы можете использовать LogonUser для олицетворения локальной группы, а не только для учетных записей домена.

Из сети:

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 
2 голосов
/ 20 апреля 2009

WNetAddConnection2 сделает свое дело. Просто используйте пустую строку для имени локального устройства, чтобы избежать сопоставления диска. Вы также хотите убедиться и закрыть соединение , когда вы закончите. Я обернул его в класс NetworkConnection, который реализует IDisposable.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...