将文件复制到我无权访问的网络共享

Posted

技术标签:

【中文标题】将文件复制到我无权访问的网络共享【英文标题】:Copying a file to a network share which I don't have access to 【发布时间】:2012-07-10 14:55:17 【问题描述】:

这是this问题的扩展

我正在尝试将文件从本地用户的临时文件夹复制到远程文件共享。 我无权访问远程文件共享,所以我必须模拟一个可以访问的用户。

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

本地文件的访问被拒绝

(因为我现在正在冒充另一个用户)。

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

【问题讨论】:

【参考方案1】:

设法找到答案,

我只需要在模拟远程用户之前为本地文件创建一个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_LOGON_NEW_CREDENTIALS = 9 和 LOGON32_PROVIDER_WINNT50 = 3 以通过网络获得访问权限,然后您可以在模拟后使用常规副本。

以上是关于将文件复制到我无权访问的网络共享的主要内容,如果未能解决你的问题,请参考以下文章

无法复制,因为您无权访问 ios 中的应用程序包

如何启用 iOS 文件应用程序以将文件复制到我的应用程序中?

应用程序注册失败,因为文件位于网络共享上。在注册包之前将文件复制到本地计算机

有没有办法将位于我的网站目录中的文件复制到我的本地驱动器访问vba

File.Copy() 从网络共享到同一台机器上的另一个共享是不是通过网络复制文件?

java实时监控局域网共享文件夹并复制文件到指定位置