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

2024-02-23

这是一个扩展this https://stackoverflow.com/questions/295538/how-to-provide-user-name-and-password-when-connecting-to-a-network-share问题

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

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

LOCAL 文件的访问被拒绝

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

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


设法找到答案,

我只需创建一个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);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 处理中点/笔划的景深着色器

    最近我一直在使用下面的景深着色器 最初来自ofx后处理 https github com neilmendoza ofxPostProcessing blob master src DofPass cppOpenFrameworks 库 用
  • 在 mongodb 文档的列表中插入项目

    我有一个这样的文档 id decfed9a04b997d pushed list 我想通过存储在 python 列表中的这些子项来更新 插入 pushed list lis1 item item1 desc desc item1 item
  • Codeigniter csrf 令牌与 ajax 请求(500 内部服务器错误)

    我很难尝试通过启用了 csrf 令牌的 CI 表单发出 ajax 请求 我做了很长时间的研究 并在与此相关的每个问题中发布了相同的解决方案 即将令牌 val 添加到 ajax 请求中的序列化数据中 我在 ajaxSetup 中执行了此操作
  • 更新排序索引列以移动项目

    如果我有下表和数据允许我们使用sort index用于排序 CREATE TABLE foo id INT 11 NOT NULL AUTO INCREMENT bar id INT 11 DEFAULT NULL sort index I
  • 无法通过MacPorts安装Git-core+svn

    我试图通过 svn 将 Git core 安装到我的 Mac 上 但未成功 sudo port install git core svn gt Verifying checksum s for db46 Error Checksum md5
  • 为什么PHP没有默认构造函数? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何将一个 RDD 拆分为两个或多个 RDD?

    我正在寻找一种将 RDD 拆分为两个或多个 RDD 的方法 我见过的最接近的是Scala Spark 将集合拆分为多个RDD https stackoverflow com questions 27231524 scala spark sp
  • 我什么时候应该使用排序字典而不是字典[重复]

    这个问题在这里已经有答案了 正如我在上一篇文章中所写的那样 我对 C 世界还很陌生 因此我编写了一个小基准来相互比较 Dictionary Hashtable SortedList 和 SortedDictionary 该测试运行 8000
  • Vert.x java List 参数化

    前几天我遇到了 Vert x futures 的一个奇怪问题 虽然没有破坏代码 但仍然困扰着我 不带参数的 Future 会导致以下警告 Future 是一种原始类型 对泛型类型 Future 的引用应该参数化 添加参数 问题解决 Futu
  • IntelliJ - IntelliJ 运行配置忽略 maven.config 和 jvm.config 文件

    在我的 Maven 项目中 我有一个 mvn我的文件夹maven config and jvm config文件位于特定于项目的参数 我使用 IntelliJ 进行开发 当我运行 Maven 配置 使用捆绑的 Maven 或自定义 Mave
  • 垂直折叠动画

    我正在尝试为我的 UIView 垂直创建折叠动画 经过长时间搜索 我找到了以下链接 使用 CATransform3D 透视的折纸过渡 https stackoverflow com questions 5456642 origami tra
  • 定位空
  • 我知道对于这里的 jQuery 专家来说这一定是一个简单的问题 但老实说我不知道 如何实现它 我有以下 HTML div class panel contents ul li a href A a li li a href B a li l
  • delphi中有一个UIntToStr可以让你显示UINT64值,但是StrToUInt在哪里允许用户输入64位无符号值呢?

    我想将大的 64 位值从十进制或十六进制字符串转换为 64 位 UINT64 数据类型 有一个 UIntToStr 可以帮助将 UINT64 转换为字符串 但无法将 64 位整数转换为无符号值 作为字符串 这意味着大于 2 63 的整数值不
  • 如何使 WinForms 应用程序全屏显示

    我有一个 WinForms 应用程序 我正在尝试使其全屏显示 有点像 VS 在全屏模式下所做的那样 目前我正在设置FormBorderStyle to None and WindowState to Maximized这给了我更多的空间 但
  • 如何使用 Ruby on Rails 从电子邮件中提取所有 URL/链接?

    我正在建立一个书签网站 我想从电子邮件中提取所有 URI 链接 我的站点正在使用 Ruby on Rails 如何提取收到的电子邮件内容的所有 URL Ruby 的内置 URI 模块已经做到了这一点 来自extract http rubyd
  • 在 R 中使用 :: 来使用管道运算符“%>%”

    我正在构建一个 R 包 并且正在大量使用管道运算符 gt 我想知道如何使用 运算符从 purrr 包中调用它 我努力了purrr gt 但出现错误 我很欣赏这方面的任何指导 P D 我应该从 magrittr 调用管道操作符而不是 purr
  • 是的,验证是字符串或字符串数​​组

    我想验证一个字段是字符串还是字符串数组 这里有一个最小失败示例 https codesandbox io s formik example jmph7 fontsize 14它碰巧使用了 formik 但实际上我正在使用 yup 进行服务器
  • WKWebview iOS(swift):应用程序关闭后保持会话连接

    我想使用简单的方法在 iOS 上通过 PWA 制作一个应用程序WKWebView 我已经成功地以简单的方式实现了它ViewController并且工作正常 Problem 当我登录然后退出应用程序时 会话丢失 我必须再次登录 Questio
  • 错误“无法在字段初始值设定项中访问此内容”是什么意思?

    我想在 flutter 中创建一个类来显示警报框 它可以将标题和内容作为输入来显示错误框 但是当我使用它来访问 AlertDialog 中同一类的变量时 调试控制台显示 无法在字段初始值设定项中访问它 import package flut
  • 将文件复制到我无权访问的网络共享

    这是一个扩展this https stackoverflow com questions 295538 how to provide user name and password when connecting to a network s