C#で簡単なWindowsフォームプログラムを作成しました。私はウィンドウのユーザー名とパスワードを入力することができますし、私は入力として入力したユーザーとして実行されるコードを実行するログインボタンをクリックするとしたい。Windowsフォームプログラムを実行するユーザーを変更する
3
A
答えて
4
これを実現するには、WindowsIdentity.Impersonateメソッドを使用できます。 この方法により、コードは異なるWindows ユーザーになりすますことができます。
http://msdn.microsoft.com/en-us/library/system.security.principal.windowsidentity.impersonate.aspx
コンプリート例:ここでは良い例で、この方法の詳細については、リンクがある
// This sample demonstrates the use of the WindowsIdentity class to impersonate a user.
// IMPORTANT NOTES:
// This sample can be run only on Windows XP. The default Windows 2000 security policy
// prevents this sample from executing properly, and changing the policy to allow
// proper execution presents a security risk.
// This sample requests the user to enter a password on the console screen.
// Because the console window does not support methods allowing the password to be masked,
// it will be visible to anyone viewing the screen.
// The sample is intended to be executed in a .NET Framework 1.1 environment. To execute
// this code in a 1.0 environment you will need to use a duplicate token in the call to the
// WindowsIdentity constructor. See KB article Q319615 for more information.
using System;
using System.Runtime.InteropServices;
using System.Security.Principal;
using System.Security.Permissions;
using System.Windows.Forms;
[assembly:SecurityPermissionAttribute(SecurityAction.RequestMinimum, UnmanagedCode=true)]
[assembly:PermissionSetAttribute(SecurityAction.RequestMinimum, Name = "FullTrust")]
public class ImpersonationDemo
{
[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=System.Runtime.InteropServices.CharSet.Auto)]
private unsafe static extern int FormatMessage(int dwFlags, ref IntPtr lpSource,
int dwMessageId, int dwLanguageId, ref String lpBuffer, int nSize, IntPtr *Arguments);
[DllImport("kernel32.dll", CharSet=CharSet.Auto)]
public extern static bool CloseHandle(IntPtr handle);
[DllImport("advapi32.dll", CharSet=CharSet.Auto, SetLastError=true)]
public extern static bool DuplicateToken(IntPtr ExistingTokenHandle,
int SECURITY_IMPERSONATION_LEVEL, ref IntPtr DuplicateTokenHandle);
// Test harness.
// If you incorporate this code into a DLL, be sure to demand FullTrust.
[PermissionSetAttribute(SecurityAction.Demand, Name = "FullTrust")]
public static void Main(string[] args)
{
IntPtr tokenHandle = new IntPtr(0);
IntPtr dupeTokenHandle = new IntPtr(0);
try
{
string userName, domainName;
// Get the user token for the specified user, domain, and password using the
// unmanaged LogonUser method.
// The local machine name can be used for the domain name to impersonate a user on this machine.
Console.Write("Enter the name of the domain on which to log on: ");
domainName = Console.ReadLine();
Console.Write("Enter the login of a user on {0} that you wish to impersonate: ", domainName);
userName = Console.ReadLine();
Console.Write("Enter the password for {0}: ", userName);
const int LOGON32_PROVIDER_DEFAULT = 0;
//This parameter causes LogonUser to create a primary token.
const int LOGON32_LOGON_INTERACTIVE = 2;
tokenHandle = IntPtr.Zero;
// Call LogonUser to obtain a handle to an access token.
bool returnValue = LogonUser(userName, domainName, Console.ReadLine(),
LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT,
ref tokenHandle);
Console.WriteLine("LogonUser called.");
if (false == returnValue)
{
int ret = Marshal.GetLastWin32Error();
Console.WriteLine("LogonUser failed with error code : {0}", ret);
throw new System.ComponentModel.Win32Exception(ret);
}
Console.WriteLine("Did LogonUser Succeed? " + (returnValue? "Yes" : "No"));
Console.WriteLine("Value of Windows NT token: " + tokenHandle);
// Check the identity.
Console.WriteLine("Before impersonation: "
+ WindowsIdentity.GetCurrent().Name);
// Use the token handle returned by LogonUser.
WindowsIdentity newId = new WindowsIdentity(tokenHandle);
WindowsImpersonationContext impersonatedUser = newId.Impersonate();
// Check the identity.
Console.WriteLine("After impersonation: "
+ WindowsIdentity.GetCurrent().Name);
// Stop impersonating the user.
impersonatedUser.Undo();
// Check the identity.
Console.WriteLine("After Undo: " + WindowsIdentity.GetCurrent().Name);
// Free the tokens.
if (tokenHandle != IntPtr.Zero)
CloseHandle(tokenHandle);
}
catch(Exception ex)
{
Console.WriteLine("Exception occurred. " + ex.Message);
}
}
}
2
偽装は、スレッドのコンテキストを変更します。 IDを変更して別のプロセスを起動する場合は、runasコマンドを使用する必要があります。
キース・ブラウンによるWindowsセキュリティへの.NET開発者ガイドは、すべてのセキュリティ・シナリオを説明する素晴らしい読書です。 Online versionもご利用いただけます。
関連する問題
- 1. 実行時にWindowsフォームでASMXサービスのアドレスを変更する
- 2. Windowsフォームプログラムから印刷設定を保存する方法は?
- 3. 一部のWindowsユーザー名をプログラムで変更する(Windowsユーザーの名前を変更)
- 4. erlangサーバーを実行するWindowsシステムで "eheap_alloc"サイズを変更する方法は?
- 5. 実行中にコンテキストクラスローダーを変更する
- 6. 実行時にテーマを変更する
- 7. 実行時のアニメーションを変更する
- 8. 実行時のレイアウトテンプレートを変更する
- 9. Windowsで別のユーザーとしてAnt execを実行する
- 10. Eclipseプラグイン - ユーザーがウィンドウをパースペクティブに変更したときに実行する
- 11. 変更後に実行するコマンド
- 12. クエリの実行中に変更する
- 13. コマンドを実行中にvimのステータス行を変更する
- 14. 実行時にスタイルを変更する(トリガーを追加する)
- 15. 実行時にListViewの行項目書体を変更する
- 16. 実行時にJList行の色を変更する
- 17. 実行中のプロセスの環境変数を変更する
- 18. Delphi XE2/Intraweb12 - 実行時にポートを変更する/グローバル変数
- 19. ユーザーが変更を行った後、テキストボックスで検証を再実行する方法
- 20. Windowsの登録ユーザーと組織を変更しますか?
- 21. tomcatをWindowsサービスとして手動で実行するときにjava_optsを変更するには?
- 22. Pythonシェル内のユーザーを変更する
- 23. ユーザー名をメールログインに変更する
- 24. ユーザーのヘッダー方向を変更する
- 25. ブーストグラフライブラリastar検索ユーザーを変更する
- 26. Windowsフォームからコンソールアプリケーションを実行する
- 27. GeoDjango + SpatialiteをWindowsで実行する
- 28. WindowsでApache/PHPUnitを実行する
- 29. PHPファイルを実行するWindowsバッチファイル
- 30. windowsでexecを実行する
win32 api呼び出しなしでも実行できますか? – chakrit
@chakritはい、既にユーザートークンがある場合は、このページの例に従うことができます。 http://msdn.microsoft.com/en-us/library/w070t6ka.aspx – Espo