.NET 模拟账户跨服务器上传下载文件

using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Security.Principal;
using System.IO;
using System.Drawing;

namespace CommLib
{
    public class ShareFolder
    {
        [DllImport("advapi32.dll", SetLastError = true)]
        private static extern bool LogonUser(string
        lpszUsername, string lpszDomain, string lpszPassword,
        int dwLogonType, int dwLogonProvider, ref IntPtr phToken);

        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern bool CloseHandle(IntPtr handle);

        [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        public extern static bool DuplicateToken(IntPtr existingTokenHandle,
        int SECURITY_IMPERSONATION_LEVEL, ref IntPtr duplicateTokenHandle);


        // logon types
        const int LOGON32_LOGON_INTERACTIVE = 2;
        const int LOGON32_LOGON_NETWORK = 3;
        const int LOGON32_LOGON_NEW_CREDENTIALS = 9;

        // logon providers
        const int LOGON32_PROVIDER_DEFAULT = 0;
        const int LOGON32_PROVIDER_WINNT50 = 3;
        const int LOGON32_PROVIDER_WINNT40 = 2;
        const int LOGON32_PROVIDER_WINNT35 = 1;

        static string ShareUserName = System.Configuration.ConfigurationManager.AppSettings["ShareUserName"];
        static string ShareDomain = System.Configuration.ConfigurationManager.AppSettings["ShareDomain"];
        static string SharePassword = System.Configuration.ConfigurationManager.AppSettings["SharePassword"];
        static string SharePhotoPath = System.Configuration.ConfigurationManager.AppSettings["SharePhotoPath"];
        static string HelpUserName = System.Configuration.ConfigurationManager.AppSettings["HelpUserName"];
        static string HelpDomain = System.Configuration.ConfigurationManager.AppSettings["HelpDomain"];
        static string HelpPassword = System.Configuration.ConfigurationManager.AppSettings["HelpPassword"];
        static string HelpFilePath = System.Configuration.ConfigurationManager.AppSettings["HelpFilePath"];

        /// <summary>
        /// 上传照片到共享文件夹
        /// </summary>
        /// <param name="UploadPhotoBase64">照片Base64数据</param>
        /// <returns>照片保存路径</returns>
        public static string UploadSharePhotos(string UploadPhotoBase64)
        {
            string RemarkImages = "";//照片存放短路径

            IntPtr tokenHandle = new IntPtr(0);
            IntPtr dupeTokenHandle = new IntPtr(0);
            tokenHandle = IntPtr.Zero;
            bool returnValue = LogonUser(ShareUserName, ShareDomain, SharePassword, LOGON32_LOGON_NEW_CREDENTIALS, LOGON32_PROVIDER_DEFAULT, ref tokenHandle);
            if (returnValue == false)
            {
                int ret = Marshal.GetLastWin32Error();
                throw new System.ComponentModel.Win32Exception(ret);
            }
            WindowsIdentity newId = null;
            WindowsImpersonationContext impersonatedUser = null;
            using (newId = new WindowsIdentity(tokenHandle))
            {
                using (impersonatedUser = newId.Impersonate())
                {//操作文档
                    string[] UploadPhotos = UploadPhotoBase64.Split('|');
                    string folderDate = DateTime.Now.ToString("yyyy_MM_dd");
                    string fullfileFolder = SharePhotoPath + "\\" + folderDate;
                    if (System.IO.Directory.Exists(fullfileFolder) == false)//如果不存在就创建文件夹
                    {
                        System.IO.Directory.CreateDirectory(fullfileFolder);
                    }
                    foreach (string ImagesBase in UploadPhotos)
                    {
                        byte[] imageBytes = Convert.FromBase64String(ImagesBase);
                        string fileName = DateTime.Now.ToString("yyyy_MM_dd_hh_mm_ss_ffffff") + ".jpeg";
                        string filePath = fullfileFolder + "\\" + fileName;
                        FileStream ms = new FileStream(filePath, FileMode.Create);
                        ms.Write(imageBytes, 0, imageBytes.Length);
                        ms.Flush();
                        ms.Close();
                        RemarkImages += folderDate + "\\" + fileName + "|";//记录文件路径
                    }
                    if (RemarkImages.Length > 0)
                    {
                        RemarkImages = RemarkImages.Substring(0, RemarkImages.Length - 1);//去除尾部分隔符 |
                    }
                }
            }
            impersonatedUser.Undo();
            if (tokenHandle != IntPtr.Zero)
                CloseHandle(tokenHandle);

            return RemarkImages;
        }

        /// <summary>
        /// 从共享文件夹读取图片数据信息
        /// </summary>
        /// <param name="PhotoPath"></param>
        /// <returns></returns>
        public static MemoryStream GetSharePhoto(string PhotoPath)
        {
            System.IO.MemoryStream ms = new System.IO.MemoryStream();//照片数据流

            IntPtr tokenHandle = new IntPtr(0);
            IntPtr dupeTokenHandle = new IntPtr(0);
            tokenHandle = IntPtr.Zero;
            bool returnValue = LogonUser(ShareUserName, ShareDomain, SharePassword, LOGON32_LOGON_NEW_CREDENTIALS, LOGON32_PROVIDER_DEFAULT, ref tokenHandle);
            if (returnValue == false)
            {
                int ret = Marshal.GetLastWin32Error();
                throw new System.ComponentModel.Win32Exception(ret);
            }
            WindowsIdentity newId = null;
            WindowsImpersonationContext impersonatedUser = null;
            using (newId = new WindowsIdentity(tokenHandle))
            {
                using (impersonatedUser = newId.Impersonate())
                {//操作文档
                    string fileFolder = System.Configuration.ConfigurationManager.AppSettings["SharePhotoPath"];
                    string filePath = fileFolder + "\\" + PhotoPath;//图片存放路径
                    if (System.IO.File.Exists(filePath))
                    {
                        Image Photo = Image.FromFile(filePath);
                        Photo.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
                        Photo.Dispose();
                    }
                }
            }
            impersonatedUser.Undo();
            if (tokenHandle != IntPtr.Zero)
                CloseHandle(tokenHandle);

            return ms;
        }

        public static byte[] GetFile(string DownFileName)
        {
            byte[] DownloadFile = null;//要下载的文件的数据

            IntPtr tokenHandle = new IntPtr(0);
            IntPtr dupeTokenHandle = new IntPtr(0);
            tokenHandle = IntPtr.Zero;
            bool returnValue = LogonUser(HelpUserName, HelpDomain, HelpPassword, LOGON32_LOGON_NEW_CREDENTIALS, LOGON32_PROVIDER_DEFAULT, ref tokenHandle);
            if (returnValue == false)
            {
                int ret = Marshal.GetLastWin32Error();
                throw new System.ComponentModel.Win32Exception(ret);
            }
            WindowsIdentity newId = null;
            WindowsImpersonationContext impersonatedUser = null;
            using (newId = new WindowsIdentity(tokenHandle))
            {
                using (impersonatedUser = newId.Impersonate())
                {//操作文档
                    string filePath = HelpFilePath + "\\" + DownFileName;//图片存放路径
                    DownloadFile = File.ReadAllBytes(filePath);//获取文件数据
                }
            }
            impersonatedUser.Undo();
            if (tokenHandle != IntPtr.Zero)
                CloseHandle(tokenHandle);

            return DownloadFile;
        }
    }
}


web.config


  <appSettings>
    <add key="SharePhotoPath" value="\\VMXP\Test"/>
    <add key="ShareUserName" value="Guest"/>
    <add key="SharePassword" value="123456"/>
    <add key="ShareDomain" value="VMXP"/>

    <add key="HelpFilePath" value="\\VMXP\Test"/>
    <add key="HelpUserName" value="Guest"/>
    <add key="HelpPassword" value="123456"/>
    <add key="HelpDomain" value="VMXP"/>
  </appSettings>


你可能感兴趣的:(.net,exception,String,服务器,null,credentials)