我正在尝试执行以下操作: 1. 我在我的 XP 中使用运行 VS.NET 2005 的 SP2 机器以管理员帐户登录 2. 这台机器还有另一个帐户 user1,它是一个访客帐户 3. 我正在运行一个程序管理员,我想从这个程序中启动一个 notepad.exe 进程,它将在 user1 安全上下文 4 下运行。我特别想用它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
]