using System.Security.Principal; using System.Runtime.InteropServices; using System.ComponentModel; // 클릭이벤트에서 권한 획득 protected void btn_Click(object sender, EventArgs e) { // Admin 권한 획득 using (new Impersonator("컴퓨터계정", "IP주소", "비밀번호")) { // 권한 획득후 실행할 함수를 넣어주세요 } } // 네트워크 권한 획득 public class Impersonator :IDisposable { private WindowsImpersonationContext impersonationContext = null; private const int LOGON32_LOGON_INTERACTIVE = 2; private const int LOGON32_PROVIDER_DEFAULT = 0; [DllImport("advapi32.dll", SetLastError = true)] private static extern int LogonUser(string lpszUserName, string lpszDomain, string lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken); [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern int DuplicateToken(IntPtr hToken, int impersonationLevel, ref IntPtr hNewToken); [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern bool RevertToSelf(); [DllImport("kernel32.dll", CharSet = CharSet.Auto)] private static extern bool CloseHandle(IntPtr handle); public Impersonator(string userName, string domainName, string password) { ImpersonateValidUser(userName, domainName, password); } public void Dispose() { UndoImpersonation(); } private void ImpersonateValidUser(string userName, string domain, string password) { WindowsIdentity tempWindowsIdentity = null; IntPtr token = IntPtr.Zero; IntPtr tokenDuplicate = IntPtr.Zero; try { if (RevertToSelf()) { if (LogonUser( userName, domain, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref token) != 0) { if (DuplicateToken(token, 2, ref tokenDuplicate) != 0) { tempWindowsIdentity = new WindowsIdentity(tokenDuplicate); impersonationContext = tempWindowsIdentity.Impersonate(); } else { throw new Win32Exception(Marshal.GetLastWin32Error()); } } else { throw new Win32Exception(Marshal.GetLastWin32Error()); } } else { throw new Win32Exception(Marshal.GetLastWin32Error()); } } finally { if (token != IntPtr.Zero) { CloseHandle(token); } if (tokenDuplicate != IntPtr.Zero) { CloseHandle(tokenDuplicate); } } } private void UndoImpersonation() { if (impersonationContext != null) { impersonationContext.Undo(); } } } // 참고 : 전체 페이지 에서 윈도우 계정 권한 획득 - wep.config 파일에 아래와 같이 첨부 //
2011년 9월 5일 월요일
ASP.NET 특정페이지(이벤트)에서 윈도우계정 권한 획득하기
피드 구독하기:
댓글 (Atom)
댓글 없음:
댓글 쓰기