Я пытаюсь сделать следующее:
1. Я вошел в систему как учетная запись администратора в моей XP с машиной SP2 под управлением VS.NET 2005
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
]