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

这是this问题的扩展

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

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

本地文件的访问被拒绝

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

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

【问题讨论】:

    标签: c# security impersonation file-copying


    【解决方案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 以通过网络获得访问权限,然后您可以在模拟后使用常规副本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多