0

FileInfo と CopyTo を使用して、ネットワーク経由でいくつかのファイルを移動したいと考えています。特定のユーザー アカウントを使用してアクセスする必要があるサーバー上の共有にファイルを移動する必要があります。これを行うにはどうすればよいですか? そのユーザーになりすましてコピーを行う必要がありますか?

私は .net 4 を使用していますが、なりすましを実現する最善の方法は何かと考えていました。pInvoke の使用と advapi32.dll の使用について読んだことがありますが、誰かがこれを行うためのより良い方法を推奨できることを望んでいました。

ご意見ありがとうございます。

編集 返信ありがとうございます。これはサービスではなく、コンソール アプリですが、複数のマシンから実行されます。偽装を使用するよりもマッピングを使用する利点はありますか、またはその逆ですか? 推奨されるアプローチは何ですか?
バッチ ファイルを使用してマッピングを作成し、コピーを実行することも検討しましたが、コピー元のフォルダーが常に同じとは限らないため、どれだけ簡単に実行できるかわかりませんでした。常に 1 つのディレクトリ内にあるためです。 、ただし、サブディレクトリ名は変更されます。

4

2 に答える 2

0

なりすましは必要ありません。必要なのは、使用する資格情報を使用してファイル マッピングを確立することだけです。これは、 net useを shell out コマンドとして使用するか、 WNetAddConnection2を使用して実行できます。

于 2010-10-26T14:46:45.587 に答える
0

サービスとして実行している場合は、偽装が必要になる場合があります。これは完全なコードではありませんが、その要点です:

     [DllImport("advapi32.dll", SetLastError = true)]
    private static extern bool LogonUser(string lpszUsername, string lpszDomain, string lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken);

    [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
    private static extern unsafe int FormatMessage(int dwFlags, ref IntPtr lpSource, int dwMessageId, int dwLanguageId, ref string lpBuffer, int nSize, IntPtr* arguments);

    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern bool CloseHandle(IntPtr handle);


IntPtr token = IntPtr.Zero;

            bool isSuccess = LogonUser(username, domain, password, impersonationType, Logon32ProviderDefault, ref token);
            if (!isSuccess)
            {
                RaiseLastError();
            }

            WindowsIdentity newIdentity = new WindowsIdentity(token);
            WindowsImpersonationContext impersonatedUser = newIdentity.Impersonate();

トークンを保存してから後で

CloseHandle(token);
于 2010-10-26T14:47:55.657 に答える