web-dev-qa-db-ja.com

リモート管理者の資格情報を使用してファイルをリモートコンピューターにコピーする

私はC#を使用しています...

ファイルのセットを約500台の固有のコンピューターにコピーする機能が必要です。 LogonUser()メソッドを使用して、ファイルをコピーするために必要なアクセス許可を持つドメインアカウントを偽装することができました。ファイルの宛先パスは次のようになります。

\\ RemoteComputer\C $\SomeFolder

私の質問は...強力なドメインアカウントを使用せずにこれを行う方法はありますか(これらのコンピューターは将来ドメインに参加しない可能性があります)?すべてのコンピューターのローカル管理者アカウントを持っています...ドメインアカウントではなくローカル管理者アカウントを使用してファイルをコンピューターにコピーする簡単な方法はありますか?

11
Casey Gay

私が間違っている場合は訂正してください。ただし、 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 
7
Shay Erlichmen

WNetAddConnection2 でうまくいきます。ドライブのマッピングを回避するために、ローカルデバイス名に空の文字列を使用するだけです。また、完了したら 接続を閉じる を確認する必要があります。 IDisposableを実装するNetworkConnectionクラスにラップします。

2
Mark Brackett