ํ๋ก๊ทธ๋จ์์ ๋ณด์ ์ธ์ฆ์ ๊ตฌํํ๊ฑฐ๋, ํน์ ๊ณ์ ์ผ๋ก ๋์์ ์ํํด์ผ ํ ๋ ํ์ฉํ ๋ ์๊ฒฉ ์ฆ๋ช ๊ด๋ฆฌ์๋ฅผ ๋ก๊ทธ์ธํฉ๋๋ค.
๊ฐ๋ น, ํ์ฌ์ ํ์ผ ์๋ฒ์ ์ ๊ทผํ๋ ค๋ฉด ๊ถํ์ด ๋ถ์ฌ๋ ๊ณ์ ์ ์๊ฒฉ ์ฆ๋ช ๊ด๋ฆฌ์์ ๋ฑ๋กํด์ผ ํฉ๋๋ค.
1. Windows API ํจ์ ์ ์ธ
(1) LogonUser
[DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Auto)]
private static extern bool LogonUser(
string lpszUsername,
string lpszDomain,
string lpszPassword,
int dwLogonType,
int dwLogonProvider,
out IntPtr phToken
);
- ์ญํ : ์ฌ์ฉ์๋ฅผ ์ธ์ฆํ๊ณ , ์ธ์ฆ๋ ์ฌ์ฉ์์ ๋ํ ๋ณด์ ํ ํฐ(phToken)์ ๋ฐํํฉ๋๋ค.
- ๋งค๊ฐ๋ณ์:
- lpszUsername: ๋ก๊ทธ์ธํ ์ฌ์ฉ์ ์ด๋ฆ.
- lpszDomain: ์ฌ์ฉ์๊ฐ ์ํ ๋๋ฉ์ธ. ๋๋ฉ์ธ ์ด๋ฆ์ด๋ ์ปดํจํฐ ์ด๋ฆ์ ์ฌ์ฉํ๋ฉฐ, ๋ก์ปฌ ์ฌ์ฉ์๋ผ๋ฉด .์ผ๋ก ์ง์ .
- lpszPassword: ์ฌ์ฉ์์ ๋น๋ฐ๋ฒํธ.
- dwLogonType: ๋ก๊ทธ์ธ ์ ํ์ ์ง์ ํ๋ ์์. ์๋ฅผ ๋ค์ด, LOGON32_LOGON_NEW_CREDENTIALS๋ ์๋ก์ด ์๊ฒฉ ์ฆ๋ช ์ ์ฌ์ฉ.
- dwLogonProvider: ๋ก๊ทธ์ธ ๊ณต๊ธ์. ๊ธฐ๋ณธ์ ์ผ๋ก LOGON32_PROVIDER_DEFAULT๋ฅผ ์ฌ์ฉ.
- phToken: ํธ์ถ์ด ์ฑ๊ณตํ๋ฉด ๋ฐํ๋๋ ์ฌ์ฉ์ ๋ณด์ ํ ํฐ ํฌ์ธํฐ.
- ๋ฐํ๊ฐ:
- true: ์ธ์ฆ ์ฑ๊ณต.
- false: ์ธ์ฆ ์คํจ. ์์ธํ ์ค๋ฅ ์ฝ๋๋ Marshal.GetLastWin32Error()๋ก ํ์ธ.
(2) CloseHandle
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
private extern static bool CloseHandle(IntPtr handle);
- ์ญํ : LogonUser๋ก ์์ฑ๋ ์ฌ์ฉ์ ๋ณด์ ํ ํฐ ํธ๋ค์ ๋ซ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํฉ๋๋ค.
- ๋งค๊ฐ๋ณ์:
- handle: ๋ซ์ ํธ๋ค(LogonUser์์ ๋ฐํ๋ phToken).
- ๋ฐํ๊ฐ:
- true: ์ฑ๊ณต์ ์ผ๋ก ํธ๋ค์ด ๋ซํ.
- false: ํธ๋ค์ ๋ซ๋ ๋ฐ ์คํจ. ์ถ๊ฐ ์ค๋ฅ๋ Marshal.GetLastWin32Error()๋ฅผ ํตํด ํ์ธ.
2. Logon Constans
(1) LOGON32_LOGON_NEW_CREDENTIALS
private const int LOGON32_LOGON_NEW_CREDENTIALS = 9;
- ์๋ฏธ: ์๋ก์ด ์๊ฒฉ ์ฆ๋ช ์ ์ฌ์ฉํ์ฌ ๋คํธ์ํฌ ๋ฆฌ์์ค์ ์ก์ธ์คํ ๋ ์ฌ์ฉํ๋ ๋ก๊ทธ์ธ ์ ํ.
- ์ฌ์ฉ ์ฌ๋ก: ๋ค๋ฅธ ๊ณ์ ์ ๋ณด์ ์ปจํ ์คํธ๋ฅผ ์์๋ก ๋น๋ ค์ ์์ ์ ์ํํด์ผ ํ ๋.
(2) LOGON32_PROVIDER_DEFAULT
private const int LOGON32_PROVIDER_DEFAULT = 0;
- ์๋ฏธ: ๊ธฐ๋ณธ ๋ก๊ทธ์ธ ๊ณต๊ธ์๋ฅผ ์ฌ์ฉ.
3. ํ๋ ๋ฐ ์ปจํ ์คํธ
(1) _userToken
private IntPtr _userToken = IntPtr.Zero;
- ์ญํ : LogonUser๋ก ๋ฐํ๋ ๋ณด์ ํ ํฐ์ ์ ์ฅ.
- ์ด๊ธฐ๊ฐ: InPtr.Zero๋ ๋น ํ ํฐ์ ๋ํ๋.
(2) _impersonationContext
private WindowsImpersonationContext _impersonationContext;
- ์ญํ : WindowsIdentity.Impersonate๋ก ์์ฑ๋ ์ฌ์ฉ์ ์ปจํ ์คํธ ์ ์ฅ
- WindowsIdentity.Impersonate ์ด๋: .NET์์ ์ ๊ณตํ๋ ๋ฉ์๋๋ก, ํน์ Windows ์ฌ์ฉ์ ๊ณ์ ์ ๊ฐ์ฅ(Impersonate)ํ์ฌ ํด๋น ๊ณ์ ์ ๋ณด์ ์ปจํ ์คํธ๋ฅผ ์ฌ์ฉํด ์์ ์ ์ํํ ์ ์๋๋ก ํด์ค๋๋ค.
- ์ฌ์ฉ ๋ชฉ์ : ์ธ์ฆ๋ ์ฌ์ฉ์์ ๋ณด์ ์ปจํ ์คํธ๋ฅผ ์์๋ก ๊ฐ์ ธ์ ์์ ์ ์ํ
4. ๋ก๊ทธ์ธ ๋ก์ง
Windows ์๊ฒฉ ์ฆ๋ช (์ฌ์ฉ์ ์ด๋ฆ, ๋๋ฉ์ธ, ๋น๋ฐ๋ฒํธ)์ ์ฌ์ฉํ์ฌ ํน์ ๊ณ์ ์ ์ธ์ฆํ๊ณ , ํด๋น ๊ณ์ ์ ๋ณด์ ์ปจํ ์คํธ๋ฅผ ํ์ฑํํ๋ ๋ฉ์๋์ ๋๋ค.
์ด๋ฅผ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ์ด ์๋์ ์ฌ์ฉ์ ๊ณ์ ๋์ ๋ค๋ฅธ ๊ณ์ ์ ๊ถํ์ผ๋ก ์์ ์ ์ํํ ์ ์์ต๋๋ค.
(1) LogonUser ํธ์ถ
bool success = LogonUser(username, domain, password, LOGON32_LOGON_NEW_CREDENTIALS, LOGON32_PROVIDER_DEFAULT, out _userToken);
- LogonUser ํจ์:
- Windows API ํจ์๋ก, ํน์ ์๊ฒฉ ์ฆ๋ช (username, domain, password)์ผ๋ก ์ฌ์ฉ์๋ฅผ ์ธ์ฆ.
- ๋งค๊ฐ๋ณ์ ์ค๋ช
:
- useername: ๋ก๊ทธ์ธํ๋ ค๋ ์ฌ์ฉ์ ๊ณ์ ์ ์ด๋ฆ.
- domain: ๊ณ์ ์ด ์ํ ๋๋ฉ์ธ, ๋ก์ปฌ, ์๋ฒ ๊ณ์ ์ด๋ผ๋ฉด "." ๋๋ ๋จธ์ ์ด๋ฆ์ ์ฌ์ฉ. ex)192.266.1.5
- password: ํด๋น ๊ณ์ ์ ๋น๋ฐ๋ฒํธ
- LOGON32_LOGON_NEW_CREDENTIALS
- ์๋ก์ด ์๊ฒฉ ์ฆ๋ช ์ผ๋ก ์์ ์ ์ํ.
- ๋คํธ์ํฌ ๋ฆฌ์์ค ์ก์ธ์ค ๋ฑ์์ ์ฌ์ฉ.
- LOGON32_PROVIDER_DEFAULT
- ๊ธฐ๋ณธ ์ธ์ฆ ๊ณต๊ธ์๋ฅผ ์ฌ์ฉํ๋๋ก ์ง์ .
- out _userToken:
- ์ฑ๊ณต ์ ๋ฐํ๋๋ ๋ณด์ ํ ํฐ์ ์ ์ฅํ ๋ณ์.
- ์ดํ WindowsIdentity๋ฅผ ์์ฑํ๊ฑฐ๋ CloseHandle๋ก ํด์ ํ๋๋ฐ ์ฌ์ฉ.
(2) ์๋ฌ ์ฒ๋ฆฌ
if (!success)
{
int errorCode = Marshal.GetLastWin32Error();
MessageBox.Show("์ธ์ฆ ์คํจ: ์ค๋ฅ ์ฝ๋ " + errorCode);
return false;
}
- LogonUser๊ฐ ์คํจํ๋ฉด:
- Marshal.GetLastWin32Error ๋ฅผ ํตํด Windows API์์ ๋ฐ์ํ ๋ง์ง๋ง ์๋ฌ ์ฝ๋๋ฅผ ๊ฐ์ ธ์ด.
- ์ฌ์ฉ์์๊ฒ ์คํจ ๋ฉ์์ง์ ์๋ฌ ์ฝ๋๋ฅผ ํ์.
(3) WindowsIdentity.Impersonate๋ก ๋ณด์ ์ปจํ ์คํธ ์ ํ
_impersonationContext = WindowsIdentity.Impersonate(_userToken);
- WindowsIdentity.Impersonate:
- _userToken์ ์ฌ์ฉํ์ฌ ํ์ฌ ์ค๋ ๋์ ๋ณด์ ์ปจํ ์คํธ๋ฅผ ๋ณ๊ฒฝ.
- ์ดํ ์ฝ๋๊ฐ ์๋ก์ด ๊ณ์ (์ง์ ๋ ์ฌ์ฉ์ ๊ณ์ )์ ๊ถํ์ผ๋ก ์คํ.
- ๋ฐํ๊ฐ:
- WindowsImpersonationContext ๊ฐ์ฒด: ์ปจํ ์คํธ๋ฅผ ๋ณต์ํ ๋ ์ฌ์ฉ.
(3) ์์ธ ์ฒ๋ฆฌ
catch (Exception ex)
{
MessageBox.Show("์ธ์ฆ ์ค๋ฅ: " + ex.Message);
return false;
}
- ์ธ์ฆ ๋์ค ์์ธ ๋ฐ์ ์ ์ฌ์ฉ์์๊ฒ ๋ฉ์์ง๋ฅผ ํ์.
- ์์ธ์ ์์ธ์ ํ์ธํ ์ ์๋๋ก ex.Message๋ฅผ ์ถ๋ ฅ.
5. ๋ก๊ทธ์์ ๋ก์ง
Windows ์๊ฒฉ ์ฆ๋ช ๊ด๋ฆฌ์์์ ์์ฑ๋ ๋ณด์ ์ปจํ ์คํธ๋ฅผ ์ข ๋ฃํ๊ณ , ์ด๋ฅผ ์ํด ์ฌ์ฉ๋ ์์์ ์์ ํ๊ฒ ํด์ ํ๋ ๋ฉ์๋์ ๋๋ค.
์ธ์ฆ ์์ ์ด ๋๋ ๋ค ์์์ ์ ๋ฆฌํ์ฌ ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฐ ๋ณด์ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๋ ์ญํ ์ ํฉ๋๋ค.
(1) ์ธ์ฆ ์ปจํ ์คํธ ์ข ๋ฃ
if (_impersonationContext != null)
{
_impersonationContext.Undo();
_impersonationContext = null;
}
- _impersonationContext:
- ์ด์ ์ WindowsIdentity.Impersonate๋ก ์์ฑ๋ ๋ณด์ ์ปจํ ์คํธ๋ฅผ ๋ํ๋.
- ํ์ฌ ์ค๋ ๋๊ฐ ๋ค๋ฅธ ๊ณ์ ์ ๊ถํ์ผ๋ก ์์ ใ ๋ฅด ์ํํ๊ณ ์์์ ์๋ฏธ.
- Undo():
- ํ์ฌ ์ค๋ ๋์ ๋ณด์ ์ปจํ ์คํธ๋ฅผ ์๋ ์ํ(๋ก๊ทธ์ธํ ๊ณ์ ์ ๊ถํ)๋ก ๋ณต์.
- ๋ณต์ ์์ ํ_impersonationContext๋ ๋ ์ด์ ํ์ํ์ง ์์ผ๋ฏ๋ก null๋ก ์ค์ ํ์ฌ ์ ๋ฆฌ.
- ํ์์ฑ:
- ๋ณด์ ์ปจํ ์คํธ๋ฅผ ๋ช ์์ ์ผ๋ก ์ข ๋ฃํ์ง ์์ผ๋ฉด ์ดํ ์ฝ๋๊ฐ ์๋ชป๋ ๊ณ์ ์ ๊ถํ์ผ๋ก ์คํ๋ ์ ์์.
(2) ์ฌ์ฉ์ ํ ํฐ ํด์
if (_userToken != IntPtr.Zero)
{
bool result = CloseHandle(_userToken);
if (!result)
{
int errorCode = Marshal.GetLastWin32Error();
MessageBox.Show("CloseHandle ์คํจ: ์ค๋ฅ ์ฝ๋ " + errorCode);
}
_userToken = IntPtr.Zero;
}
- _userToken:
- LogonUser ํจ์์์ ๋ฐํ๋ ๋ณด์ ํ ํฐ.
- ์์ ์ด ๋๋ ํ ๋ฐ๋์ ํด์ ํด์ผ ํจ.
- CloseHandle(_userToken):
- Windows API ํจ์๋ก, ๋ณด์ ํ ํฐ(_userToken)๊ณผ ๊ด๋ จ๋ ์์คํ ์์์ ํด์ .
- ๋ฐํ๊ฐ์ด false์ธ ๊ฒฝ์ฐ ํด์ ์คํจ๋ฅผ ์๋ฏธ.
- Marshal.GetLastWin32Error():
- CloseHandle ํธ์ถ์ด ์คํจํ ๊ฒฝ์ฐ, Windows API์์ ๋ฐ์ํ ๋ง์ง๋ง ์๋ฌ ์ฝ๋๋ฅผ ๊ฐ์ ธ์ด.
- ์๋ฌ ์ฝ๋๋ฅผ ํ์ธํ์ฌ ์์ธ์ ํ์ ํ๊ณ , ์ฌ์ฉ์์๊ฒ ์๋ฆผ ๋ฉ์์ง๋ก ํ์.
- ํ์์ฑ:
- ๋ณด์ ํ ํฐ์ ํด์ ํ์ง ์์ผ๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋์์ ๋ณด์ ์ทจ์ฝ์ ๋ฐ์ ๊ฐ๋ฅ
์ ์ฒด์ฝ๋
// Windows API ํจ์ ์ ์ธ
[DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Auto)]
private static extern bool LogonUser(
string lpszUsername,
string lpszDomain,
string lpszPassword,
int dwLogonType,
int dwLogonProvider,
out IntPtr phToken
);
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
private extern static bool CloseHandle(IntPtr handle);
// Logon Constants
private const int LOGON32_LOGON_NEW_CREDENTIALS = 9; // ์๋ก์ด ์๊ฒฉ ์ฆ๋ช
์ผ๋ก ๋ก๊ทธ์ธ
private const int LOGON32_PROVIDER_DEFAULT = 0; // ๊ธฐ๋ณธ ์ธ์ฆ ์ ๊ณต์๋ฅผ ์ฌ์ฉํ๋๋ก ์ง์
private IntPtr _userToken = IntPtr.Zero;
private WindowsImpersonationContext _impersonationContext;
// ์๊ฒฉ์ฆ๋ช
๊ด๋ฆฌ์ ๋ก๊ทธ์ธ
private bool AuthenticateUser(string username, string domain, string password)
{
try
{
// ์ธ์ฆ์ ์ํ Windows API ํธ์ถ
bool success = LogonUser(username, domain, password, LOGON32_LOGON_NEW_CREDENTIALS, LOGON32_PROVIDER_DEFAULT, out _userToken);
if (!success)
{
int errorCode = Marshal.GetLastWin32Error();
MessageBox.Show("์ธ์ฆ ์คํจ: ์ค๋ฅ ์ฝ๋ " + errorCode);
return false;
}
// ์ธ์ฆ ์ปจํ
์คํธ ์์
_impersonationContext = WindowsIdentity.Impersonate(_userToken);
return true;
}
catch (Exception ex)
{
MessageBox.Show("์ธ์ฆ ์ค๋ฅ: " + ex.Message);
return false;
}
}
// ์๊ฒฉ์ฆ๋ช
๊ด๋ฆฌ์ ๋ก๊ทธ์์
private void LogoutUser()
{
try
{
// ์ธ์ฆ ์ปจํ
์คํธ ์ข
๋ฃ ๋ฐ ์์ ํด์
if (_impersonationContext != null)
{
_impersonationContext.Undo();
_impersonationContext = null;
}
// ์ฌ์ฉ์ ํ ํฐ์ ์์ ํ๊ฒ ๋ซ๊ธฐ
if (_userToken != IntPtr.Zero)
{
bool result = CloseHandle(_userToken);
if (!result)
{
// CloseHandle ์คํจ ์ ์๋ฌ ๋ก๊ทธ ์ถ๊ฐ
int errorCode = Marshal.GetLastWin32Error();
// ์ ์ ํ ๋ก๊น
๋๋ ์์ธ ์ฒ๋ฆฌ
MessageBox.Show("CloseHandle ์คํจ: ์ค๋ฅ ์ฝ๋ " + errorCode);
}
_userToken = IntPtr.Zero;
}
}
catch (Exception ex)
{
// ์์ธ ์ฒ๋ฆฌ: ๋ก๊ทธ์์ ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ์ด๋ฅผ ์ฒ๋ฆฌ
MessageBox.Show("๋ก๊ทธ์์ ์ค ์ค๋ฅ ๋ฐ์: " + ex.Message);
}
}
// ์คํ ํจ์
private bool action(){
// ์๊ฒฉ ์ฆ๋ช
๊ด๋ฆฌ์ ๋ก๊ทธ์ธ:username, domain, password
if (!AuthenticateUser("username", "188.161.2.250", "password"))
{
MessageBox.Show("์๊ฒฉ ์ฆ๋ช
๊ด๋ฆฌ์ ๋ก๊ทธ์ธ์ด ์คํจํ์ต๋๋ค. ์์
์ ์ทจ์ํฉ๋๋ค.");
return false; // ๋ก๊ทธ์ธ ์คํจ ์ ์์
์ทจ์
}
try
{
// ๊ณ์ ๊ถํ์ผ๋ก ์คํํ ์์
MessageBox.Show("์ธ์ฆ ์ฑ๊ณต! ํ์ฌ ์ฌ์ฉ์: " + WindowsIdentity.GetCurrent().Name);
}
finally
{
LogoutUser(); // ์ธ์ฆ ์ปจํ
์คํธ ์ข
๋ฃ
}
}
'๐ Development > C#' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[C#] ๋ค์์คํ์ด์ค(namespace) ๋? (3) | 2024.11.20 |
---|---|
[C#] GDI+ (Graphics Device Interface Plus) ๋? (1) | 2024.11.19 |
C#๊ณผ .NET์ผ๋ก ์น์บ ์ดฌ์ ๋ฐ ์ ์ฅ ์์ (3) | 2024.11.12 |
C#๊ณผ .NET ๊ด๊ณ, ์ฝ๊ฒ ์ดํดํ๊ธฐ (2) | 2024.11.11 |