私は次のことをしようとしています: 1. VS.NET 2005 を実行している XP SP2 マシンに管理者アカウントとしてログインしています 2. このマシンには、ゲスト アカウントである別のアカウント user1 もあります 3. 次のようにプログラムを実行しています管理者、このプログラムから、user1 セキュリティ コンテキスト 4 で実行される notepad.exe プロセスを起動したいと考えてCreateProcessasUser
います。
これは、私が試したことを説明するコードスニッパーです..
const string GRANTED_ALL = "10000000";
const int LOGON32_LOGON_INTERACTIVE = 2;
const int LOGON32_LOGON_NETWORK = 3;
const int LOGON32_LOGON_BATCH = 4;
const int LOGON32_LOGON_SERVICE = 5;
const int LOGON32_LOGON_UNLOCK = 7;
const int LOGON32_LOGON_NETWORK_CLEARTEXT = 8;
const int LOGON32_LOGON_NEW_CREDENTIALS = 9;
const int LOGON32_PROVIDER_DEFAULT = 0;
static IntPtr hToken = IntPtr.Zero;
static IntPtr hTokenDuplicate = IntPtr.Zero;
static void Main(string[] args)
{
int last_error = 0;
if(LogonUser("user1",null,"#welcome123",
LOGON32_LOGON_INTERACTIVE,
LOGON32_PROVIDER_DEFAULT, out hToken))
{
last_error = Marshal.GetLastWin32Error();
PROCESS_INFORMATION pi = new PROCESS_INFORMATION();
STARTUPINFO si = new STARTUPINFO();
SECURITY_ATTRIBUTES sa = new SECURITY_ATTRIBUTES();
last_error = 0;
last_error = Marshal.GetLastWin32Error();
if(DuplicateTokenEx(hToken,UInt32.Parse(GRANTED_ALL,System.Globalization.NumberStyles.HexNumber),
ref sa,SECURITY_IMPERSONATION_LEVEL.SecurityImpersonation,
TOKEN_TYPE.TokenPrimary,out hTokenDuplicate))
{
last_error = 0;
last_error = Marshal.GetLastWin32Error();
CreateProcessAsUser(hTokenDuplicate, "d:\\san\\notepad.exe", null,
ref sa, ref sa, false, 0, IntPtr.Zero, "d:\\san", ref si, out pi);
last_error = 0;
last_error = Marshal.GetLastWin32Error();
}
}
last_error = 0;
last_error = Marshal.GetLastWin32Error();
if (hToken != IntPtr.Zero) CloseHandle(hToken);
if (hTokenDuplicate != IntPtr.Zero) CloseHandle(hTokenDuplicate);
}
何らかの理由でこれは機能していません..DuplicateTokenEx
関数は1305のエラーコードとして返されており、その理由がわかりません..
DuplicateTokenEx
も使用した代わりにDuplicateToken
、CreateProcessAsUser
がエラー コード 1308 を返すようになりました。
誰かがこの問題に光を当ててくれませんか..これは明らかに非常に単純なことのように見えますが、正しく理解できません.. [私は特にやりたいことに注意しLogonUser
てDuplicateToken
くださいCreateProcessAsUSer
]