Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.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# 将文件复制到我不知道的网络共享';我无法访问_C#_Security_Impersonation_File Copying - Fatal编程技术网

C# 将文件复制到我不知道的网络共享';我无法访问

C# 将文件复制到我不知道的网络共享';我无法访问,c#,security,impersonation,file-copying,C#,Security,Impersonation,File Copying,这是问题的延伸 我正在尝试将文件从本地用户的临时文件夹复制到远程文件共享。 我没有访问远程文件共享的权限,因此我必须模拟有访问权限的用户 现在,我可以成功地从远程服务器读取文件并将其复制到本地,但是我无法将本地文件写入共享,因为这会导致以下错误: 本地文件的访问被拒绝 (因为我现在正在模拟另一个用户) 如果您需要一些代码,我可以发布。设法找到了答案 在模拟远程用户之前,我只需为本地文件创建一个FileStream,然后将该FileStream传递给复制函数 编辑: 下面是我的整个文件复制例程 u

这是问题的延伸

我正在尝试将文件从本地用户的临时文件夹复制到远程文件共享。 我没有访问远程文件共享的权限,因此我必须模拟有访问权限的用户

现在,我可以成功地从远程服务器读取文件并将其复制到本地,但是我无法将本地文件写入共享,因为这会导致以下错误:

本地文件的访问被拒绝

(因为我现在正在模拟另一个用户)


如果您需要一些代码,我可以发布。

设法找到了答案

在模拟远程用户之前,我只需为本地文件创建一个
FileStream
,然后将该
FileStream
传递给复制函数

编辑: 下面是我的整个文件复制例程

using System.Security.Principal;
using System.Security.Permissions;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Diagnostics;
using System.IO;

public class ImpersonatedFileCopy : IDisposable
{
    #region Assembly Functions
    [DllImport("advapi32.dll")]
    public static extern bool LogonUser(string lpszUsername, string lpszDomain, string lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken);

    [DllImport("kernel32.dll")]
    public static extern bool CloseHandle(IntPtr handle);
    #endregion

    #region Private Variables
    private IntPtr _TokenHandle = new IntPtr(0);
    private WindowsImpersonationContext _WindowsImpersonationContext;
    #endregion

    #region Constructors
    public ImpersonatedFileCopy(string domain, string username, string password)
    {
        Impersonate(domain, username, password);
    }
    #endregion

    #region Methods
    [PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
    private void Impersonate(string domain, string username, string password)
    {
        bool returnValue;

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

            _TokenHandle = IntPtr.Zero;

            //Call LogonUser to obtain a handle to an access token.
            returnValue = LogonUser(username, domain, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref _TokenHandle);
            if (returnValue)
            {
                WindowsIdentity newId = new WindowsIdentity(_TokenHandle);
                _WindowsImpersonationContext = newId.Impersonate();
            }
        }
        catch (Exception ex)
        {
            UndoImpersonate();
            Debug.Writeline("Error"+ex.Message);
        }
    }

    private void UndoImpersonate()
    {
        if (_WindowsImpersonationContext != null)
        {
            _WindowsImpersonationContext.Undo();
            if (!_TokenHandle.Equals(IntPtr.Zero))
            {
                CloseHandle(_TokenHandle);
            }
        }
    }

    public bool PutFile(FileStream source, string destRemoteFilename, bool overwrite)
    {
        try
        {
            if (!Directory.Exists(Path.GetDirectoryName(destRemoteFilename))) Directory.CreateDirectory(Path.GetDirectoryName(destRemoteFilename));
            using (FileStream dest = File.OpenWrite(destRemoteFilename))
            {
               source.Seek(0, SeekOrigin.Begin);
               source.CopyTo(dest);
            }
            return true;
        }
        catch
        {
            return false;
        }
    }

    public bool GetFile(string sourceRemoteFilename, FileStream dest, bool overwrite)
    {
        try
        {
            using (FileStream source = File.OpenRead(sourceRemoteFilename))
            {
                source.Seek(0, SeekOrigin.Begin);
                source.CopyTo(dest);
            }
            return true;
        }
        catch
        {
            return false;
        }
    }
    #endregion

    #region IDisposable
    public void Dispose()
    {
        UndoImpersonate();
        GC.SuppressFinalize(this);
    }
    #endregion
}
和用法:

using (FileStream dest = File.OpenWrite(localDestinationFilename))
using (copy = new ImpersonatedFileCopy(domain,user,pass))
{
   success = copy.GetFile(remoteSourceFilename, dest, true);
}

尝试将其更改为使用:LOGON32\u LOGON\u NEW\u CREDENTIALS=9和LOGON32\u PROVIDER\u WINNT50=3以通过网络访问,然后您可以在模拟后使用常规副本。