Windows 가장은 로그인 세부 정보를 사용하여 사용자 토큰을 획득함으로써이 문제를 해결합니다. 이 토큰을 사용하여 WindowsIdentity를 얻은 다음 가장 컨텍스트를 생성하는 데 사용할 수 있습니다. 이 컨텍스트 범위 내에서 이라는 파일 시스템에 가장 된 사용자 인에 액세스 할 수 있습니다.
물론이 접근 방식을 사용하려면 사용자 이름과 암호를 저장해야합니다.
먼저, 윈도우에서 사용자 토큰을 얻기 위해 필요한 윈도우 API를 정의하십시오 WindowsIdentity aquire 이러한 API를 사용하여 다음
internal class WindowsAPI
{
public const int LOGON32_PROVIDER_DEFAULT = 0;
public const int LOGON32_LOGON_INTERACTIVE = 2;
[DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
public static extern bool LogonUser(String lpszUsername,
String lpszDomain, String lpszPassword,
int dwLogonType, int dwLogonProvider, ref IntPtr phToken
);
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public extern static bool CloseHandle(IntPtr handle);
}
을 :
private WindowsIdentity GetIdentity(string userName, string password)
{
_userToken = IntPtr.Zero;
if (!WindowsAPI.LogonUser(
userName,
AbbGrainDomain,
password,
WindowsAPI.LOGON32_LOGON_INTERACTIVE, WindowsAPI.LOGON32_PROVIDER_DEFAULT,
ref _userToken
))
{
int errorCode = Marshal.GetLastWin32Error();
throw new System.ComponentModel.Win32Exception(errorCode);
}
return new WindowsIdentity(_userToken);
}
마지막을,이 ID를 사용 명의 도용 문맥을 생성하십시오 :
public List<string> GetDirectories(string searchPath)
{
using (WindowsImpersonationContext wic = GetIdentity().Impersonate())
{
var directories = new List<string>();
var di = new DirectoryInfo(searchPath);
directories.AddRange(di.GetDirectories().Select(d => d.FullName));
return directories;
}
}
마지막으로 창문 IDisposable 패턴을 사용하여 저장된 _userToken을 사용하여 처리 :
if (_userToken != IntPtr.Zero)
WindowsAPI.CloseHandle(_userToken);
나는 그것이 IPrincipal –