網上找了很多案例,都試了,還是這個最方便,試試吧~~
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