2009-03-31 5 views
3

현재 IPrincipal에서 액세스 할 수있는 파일 및 디렉토리에 액세스하려면 다른 파일을 나열하지 말고 Directory.GetDirectories() 및 Directory.GetFiles() 메소드를 사용해야합니다. 프로세스 자체는 NETWORK SERVICE로 실행되므로 이러한 호출 기간 동안 주체를 IPrincipal을 통해 현재 사용자로 변경해야합니다.IPrincipal을 사용한 파일 및 디렉토리 보안

파일 액세스 부분 이전에 Thread.CurrentPrincipal을 새 IPrincipal로 변경하려고 시도했지만 차이가없는 것으로 보입니다.

내가 할 수있는 다른 방법이 있습니까, 아니면 뭔가 빠졌습니까?

+0

나는 그것이 IPrincipal –

답변

5

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); 
0

나는 이것이 올바른 방법이라고 생각하지 않습니다. 가장을 사용하여 조사해야합니다. 예를 들어 이것을 수행하는 방법에 대한 자습서는 this을 참조하십시오.

-1

DllImport 및 LogonUser win32 API를 사용하여 다른 사용자를 가장 할 수 있습니다.

관련 문제