网上找了很多案例,都试了,还是这个最方便,试试吧~~
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