C#通過賬號密碼訪問共享文件夾/目錄

網上找了很多案例,都試了,還是這個最方便,試試吧~~

C#.NET 代碼

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.IO;

namespace ConsoleApp41
{
    class Program
    {
        static void Main(string[] args)
        {
            //模擬身份
            using (SharedTool tool = new SharedTool("administrator", "123456", "10.10.10.1"))
            {
                string selectPath = @"\\10.10.10.1\c$";

                var dicInfo = new DirectoryInfo(selectPath);//選擇的目錄信息  

                DirectoryInfo[] dic = dicInfo.GetDirectories("*.*", SearchOption.TopDirectoryOnly);
                foreach (DirectoryInfo temp in dic)
                {
                    Console.WriteLine(temp.FullName);
                }

                Console.WriteLine("---------------------------");
                FileInfo[] textFiles = dicInfo.GetFiles("*.*", SearchOption.TopDirectoryOnly);//獲取所有目錄包含子目錄下的文件  
                foreach (FileInfo temp in textFiles)
                {
                    Console.WriteLine(temp.Name);
                }
            }

            Console.ReadKey();
        }
    }

    public class SharedTool : IDisposable
    {
        // obtains user token       
        [DllImport("advapi32.dll", SetLastError = true)]
        static extern bool LogonUser(string pszUsername, string pszDomain, string pszPassword,
            int dwLogonType, int dwLogonProvider, ref IntPtr phToken);

        // closes open handes returned by LogonUser       
        [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
        extern static bool CloseHandle(IntPtr handle);

        [DllImport("Advapi32.DLL")]
        static extern bool ImpersonateLoggedOnUser(IntPtr hToken);

        [DllImport("Advapi32.DLL")]
        static extern bool RevertToSelf();
        const int LOGON32_PROVIDER_DEFAULT = 0;
        const int LOGON32_LOGON_NEWCREDENTIALS = 9;//域控中的需要用:Interactive = 2       
        private bool disposed;

        public SharedTool(string username, string password, string ip)
        {
            // initialize tokens       
            IntPtr pExistingTokenHandle = new IntPtr(0);
            IntPtr pDuplicateTokenHandle = new IntPtr(0);

            try
            {
                // get handle to token       
                bool bImpersonated = LogonUser(username, ip, password,
                    LOGON32_LOGON_NEWCREDENTIALS, LOGON32_PROVIDER_DEFAULT, ref pExistingTokenHandle);

                if (bImpersonated)
                {
                    if (!ImpersonateLoggedOnUser(pExistingTokenHandle))
                    {
                        int nErrorCode = Marshal.GetLastWin32Error();
                        throw new Exception("ImpersonateLoggedOnUser error;Code=" + nErrorCode);
                    }
                }
                else
                {
                    int nErrorCode = Marshal.GetLastWin32Error();
                    throw new Exception("LogonUser error;Code=" + nErrorCode);
                }
            }
            finally
            {
                // close handle(s)       
                if (pExistingTokenHandle != IntPtr.Zero)
                    CloseHandle(pExistingTokenHandle);
                if (pDuplicateTokenHandle != IntPtr.Zero)
                    CloseHandle(pDuplicateTokenHandle);
            }
        }

        protected virtual void Dispose(bool disposing)
        {
            if (!disposed)
            {
                RevertToSelf();
                disposed = true;
            }
        }

        public void Dispose()
        {
            Dispose(true);
        }
    }

}


VB.net 代碼

Imports System.IO
Imports System.Runtime.InteropServices

Module Module1

    Sub Main()

        Using tool As New SharedTool("administrator", "123456", "10.10.10.1")
            Dim selectPath As String = "\\10.10.10.1\c$"
            Dim dicInfo = New DirectoryInfo(selectPath)
            Dim dic As DirectoryInfo() = dicInfo.GetDirectories("*.*", SearchOption.TopDirectoryOnly)

            For Each temp As DirectoryInfo In dic
                Console.WriteLine(temp.FullName)
            Next

            Console.WriteLine("---------------------------")
            Dim textFiles As FileInfo() = dicInfo.GetFiles("*.*", SearchOption.TopDirectoryOnly)

            For Each temp As FileInfo In textFiles
                Console.WriteLine(temp.Name)
            Next
        End Using
        Console.ReadKey()
    End Sub

End Module

Public Class SharedTool
    Implements IDisposable

    <DllImport("advapi32.dll", SetLastError:=True)>
    Private Shared Function LogonUser(ByVal pszUsername As String, ByVal pszDomain As String, ByVal pszPassword As String, ByVal dwLogonType As Integer, ByVal dwLogonProvider As Integer, ByRef phToken As IntPtr) As Boolean

    End Function
    <DllImport("kernel32.dll", CharSet:=CharSet.Auto)>
    Private Shared Function CloseHandle(ByVal handle As IntPtr) As Boolean

    End Function
    <DllImport("Advapi32.DLL")>
    Private Shared Function ImpersonateLoggedOnUser(ByVal hToken As IntPtr) As Boolean

    End Function
    <DllImport("Advapi32.DLL")>
    Private Shared Function RevertToSelf() As Boolean

    End Function
    Const LOGON32_PROVIDER_DEFAULT As Integer = 0
    Const LOGON32_LOGON_NEWCREDENTIALS As Integer = 9
    Private disposed As Boolean

    Public Sub New(ByVal username As String, ByVal password As String, ByVal ip As String)
        Dim pExistingTokenHandle As IntPtr = New IntPtr(0)
        Dim pDuplicateTokenHandle As IntPtr = New IntPtr(0)

        Try
            Dim bImpersonated As Boolean = LogonUser(username, ip, password, LOGON32_LOGON_NEWCREDENTIALS, LOGON32_PROVIDER_DEFAULT, pExistingTokenHandle)

            If bImpersonated Then

                If Not ImpersonateLoggedOnUser(pExistingTokenHandle) Then
                    Dim nErrorCode As Integer = Marshal.GetLastWin32Error()
                    Throw New Exception("ImpersonateLoggedOnUser error;Code=" & nErrorCode)
                End If
            Else
                Dim nErrorCode As Integer = Marshal.GetLastWin32Error()
                Throw New Exception("LogonUser error;Code=" & nErrorCode)
            End If

        Finally
            If pExistingTokenHandle <> IntPtr.Zero Then CloseHandle(pExistingTokenHandle)
            If pDuplicateTokenHandle <> IntPtr.Zero Then CloseHandle(pDuplicateTokenHandle)
        End Try
    End Sub

    Protected Overridable Sub Dispose(ByVal disposing As Boolean)
        If Not disposed Then
            RevertToSelf()
            disposed = True
        End If
    End Sub

    Public Sub Dispose()
        Dispose(True)
    End Sub

    Private Sub IDisposable_Dispose() Implements IDisposable.Dispose
        Throw New NotImplementedException()
    End Sub
End Class

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章