Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Impersonator创建文件时连接到网络驱动器一次_C#_Impersonation_Network Drive - Fatal编程技术网

C# 使用Impersonator创建文件时连接到网络驱动器一次

C# 使用Impersonator创建文件时连接到网络驱动器一次,c#,impersonation,network-drive,C#,Impersonation,Network Drive,我必须使用指定的用户在网络驱动器中创建许多文件 我曾经连接不同的用户 我使用模拟类: public class Impersonator : IDisposable { const int LOGON32_PROVIDER_DEFAULT = 0; const int LOGON32_LOGON_INTERACTIVE = 2; [DllImport("advapi32.dll", SetLastError = true)] public static ext

我必须使用指定的用户在网络驱动器中创建许多文件

我曾经连接不同的用户 我使用模拟类:

public class Impersonator : IDisposable
{

    const int LOGON32_PROVIDER_DEFAULT = 0;
    const int LOGON32_LOGON_INTERACTIVE = 2;

    [DllImport("advapi32.dll", SetLastError = true)]
    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 extern static bool CloseHandle(IntPtr handle);

    private IntPtr token = IntPtr.Zero;
    private WindowsImpersonationContext impersonated;
    private readonly string _ErrMsg = "";

    public bool IsImpersonating
    {
        get { return (token != IntPtr.Zero) && (impersonated != null); }
    }

    public string ErrMsg
    {
        get { return _ErrMsg; }
    }

    [PermissionSetAttribute(SecurityAction.Demand, Name = "FullTrust")]
    public Impersonator(string userName, string password, string domain)
    {
        StopImpersonating();

        bool loggedOn = LogonUser(userName, domain, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref token);
        if (!loggedOn)
        {
            _ErrMsg = new System.ComponentModel.Win32Exception().Message;
            return;
        }

        WindowsIdentity identity = new WindowsIdentity(token);
        impersonated = identity.Impersonate();
    }

    private void StopImpersonating()
    {
        if (impersonated != null)
        {
            impersonated.Undo();
            impersonated = null;
        }

        if (token != IntPtr.Zero)
        {
            CloseHandle(token);
            token = IntPtr.Zero;
        }
    }

    public void Dispose()
    {
        StopImpersonating();
    }
}
以及守则:

using (Impersonator impersonator = new Impersonator("UserName", "UserPwd", "UserDomaine"))
{
    if (!Directory.Exists("Z:\\")) // check if Network drive exist
    {
       NetworkDrive drive = new NetworkDrive
       {
           ShareName = @"\\IP\Partage",
           LocalDrive = "Z",
           Force = true
       };

       drive.MapDrive(@"UserDomaine\UserName", "UserPwd");

     }
     File.Create(@"Z:\Log\FileName.txt");
}
但是在本例中,我发现每次我必须创建或更新文件时,代码都会映射驱动器!!我对这个函数做了很多工作

有一个解决方案,不是每次都映射它


在打开应用程序时,我试图将驱动程序映射到该用户,但遇到了相同的问题。

尝试不要使用Using block。将模拟程序声明为全局静态变量。

我认为您不需要映射驱动器。模拟后,您可以直接使用网络驱动器创建文件,它将以模拟用户的身份创建文件

using (Impersonator impersonator = new Impersonator("UserName", "UserPwd", "UserDomaine"))
{
    File.Create(@"\\IP\Partage\Log\FileName.txt");
}

如果不使用,将不会使用服务器上的newuserFrom,您可以尝试从windows资源管理器中访问路径,作为用户之一登录吗?我在本地it工作中测试了这一点(我必须在项目中实现这一点,并将其发送到服务器生产部门,然后告诉您结果