C#通过账号密码访问共享文件夹/目录

10 篇文章 0 订阅
本文介绍了一种使用C#.NET和VB.NET进行远程目录访问的方法,通过创建SharedTool类实现模拟身份,获取远程计算机上的目录信息和文件列表。提供了详细的代码示例,包括如何使用LogonUser函数和相关API实现身份模拟。
摘要由CSDN通过智能技术生成

网上找了很多案例,都试了,还是这个最方便,试试吧~~

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

如果使用域账号登录,则:

using (SharedTool tool = new SharedTool("domain_user", "password", "domain_name"))

并 修改 LOGON32_LOGON_NEWCREDENTIALS =2

如果使用域账号登录,但是在非加域的电脑上运行,则需要 修改 LOGON32_LOGON_NEWCREDENTIALS =9

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值