0

C# を使用して Windows アプリケーションを作成しています。Windows フォームにアップロードされたファイルをネットワーク共有に保存する必要がありますが、すべてのユーザーがネットワーク共有 ( \\FileServer\SharedFolder ) にアクセスできるわけではありません。1 人のユーザー ( FileWriter ) のみが、このフォルダーに対する読み取り/書き込み/実行のアクセス許可を持っています。現在のユーザーEmployeeUserには、この共有に対する権限がありません。Start->Run \\FileServer\SharedFolderを開いてこれを確認しました。これにより、アクセスが拒否されましたというエラー ボックスが表示されます。

SO Post のこの例を使用し、 を使用してFileWriterWNetAddConnection2のさまざまな資格情報に接続し、File.Createを使用してファイル Sample.txt を保存ました。これまでのところ、すべて問題ありませんでした。が呼び出され、コード デバッグで確認し、プログラムを終了しました。現在のユーザーから、StartMenu --> Runを開いて\\FileServer\SharedFolderと入力すると、Windows ユーザーがEmployeeUserであっても共有がすぐに開きました。エクスプローラーを閉じ、数分後 (これは試行によってランダムに変化します)、 [スタート] - > [実行] \\FileServer\SharedFolderを開きましたWNetCancelConnection2 . アクセスが拒否されましたというエラー ボックスが表示されるようになりました。

私はこれを理解することができません.これについての助けは大歓迎です.

Access Denied ボックスの後、Sample.txt (File.Create を使用) がサイレントに上書きされることを除いて、同じ手順でプログラムを再度実行します。File Exists エラーが発生するはずではありませんか?

4

1 に答える 1

0

代わりに偽装者を使用できます。

using (var impersonator = new Impersonator(username, password))
{
    File.Copy(source, destination, true);
}

これは私たちの実装からのコピーですので、ドメイン名を調整してください

using System;
using System.Runtime.InteropServices;
using System.Security.Principal;

public class Impersonator : IDisposable
{
/// <summary>
///     The Impersonator class is used to access a network share with other credentials.
/// </summary>
private readonly WindowsImpersonationContext _impersonatedUser;

private readonly IntPtr _userHandle;

/// <summary>
///     Constructor
/// </summary>
/// <param name="username">The user of the network share</param>
/// <param name="password">The password of the network share</param>
public Impersonator(string username, string password, string userDomain =   "YOURDOMAIN")
{
    _userHandle = new IntPtr(0);
    bool returnValue = LogonUser(username, userDomain, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT,
                                 ref _userHandle);
    if (!returnValue)
        throw new ApplicationException(
            "The applications wasn't able to impersonate the user with the specified credentials!");
    var newId = new WindowsIdentity(_userHandle);
    _impersonatedUser = newId.Impersonate();
}

#region IDisposable Members

public void Dispose()
{
    if (_impersonatedUser != null)
    {
        _impersonatedUser.Undo();
        CloseHandle(_userHandle);
    }
}

#endregion

#region Interop imports/constants

public const int LOGON32_LOGON_INTERACTIVE = 2;
public const int LOGON32_LOGON_SERVICE = 3;
public const int LOGON32_PROVIDER_DEFAULT = 0;

[DllImport("advapi32.dll", CharSet = CharSet.Auto)]
public static extern bool LogonUser(String lpszUserName, String lpszDomain, String lpszPassword, int dwLogonType,
                                    int dwLogonProvider, ref IntPtr phToken);

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

#endregion
}
于 2015-11-19T14:49:22.507 に答える