2009-04-19 5 views
10

私はC#を使用しています...リモート管理者の資格情報を使用してファイルをリモートコンピュータにコピー

約500個のユニークなコンピュータにファイルのセットをコピーする必要があります。 LogonUser()メソッドを使用して、ファイルをコピーするために必要なアクセス許可を持つドメインアカウントを偽装することに成功しました。ファイルの保存先パスのようなものです:

\\リモートコンピュータ\ C $ \ SomeFolder

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

答えて

7

私が間違っている場合は私を修正しますが、LogonUserを使用してドメインアカウントだけでなくローカルグループに偽装することもできます。

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

あなたは正しいです。私はlogonTypeパラメータに異なる値を使用していましたが、これはうまくいきませんでした... LOGON32_LOGON_NEW_CREDENTIALSに切り替えると、それはチャンピオンのように機能します!ありがとう! –

+1

これは、あなたが実行しているコンピュータとリモートコンピュータの管理者パスワードが同じ場合にのみ有効です。 "LogonUser関数は、ローカルコンピュータにユーザーをログオンしようとします。ローカルコンピュータは、LogonUserが呼び出されたコンピュータです.LogonUserを使用してリモートコンピュータにログオンすることはできません。 –

+0

上記のコードでは、LogOnUser機能で、ローカル管理者名をユーザー名およびローカルコンピュータ名としてドメインとパスワードをパスワードとして指定します。これらの資格情報はすべて、宛先マシン(またはサーバー)です。これは機能します。どうもありがとう! –

1

WNetAddConnection2トリックを行います。ドライブのマッピングを避けるには、ローカルデバイス名に空の文字列を使用してください。完了したら必ずclose the connectionを確認してください。私はそれをIDisposableを実装するNetworkConnectionクラスにラップします。

関連する問題