Мне нужно установить различные настройки без вывода сообщений с правами администратора. Мне приходится жестко кодировать привилегии, потому что пользователи не знают имени пользователя и пароля для самостоятельной установки настроек.
Я пробовал два разных подхода.
- ProcessStartInfo с именем пользователя, паролем и UseShellExecute = false.
Олицетворение пользователя с помощью
[DllImport("advapi32.dll", SetLastError = true)] private static extern bool LogonUser(...);
В обоих сценариях windowsPrincipal.IsInRole(WindowsBuiltInRole.Administrator)
возвращает false, и мои установки не запускаются из-за недостаточных прав.
Странное поведение: LogonUser всегда возвращает true, даже с неверными учетными данными.
Вот класс олицетворения:
namespace BlackBlade.Utilities
{
/// <summary>
/// Quelle: http://www.blackbladeinc.com/en-us/community/blogs/archive/2009/08/10/runas-in-c.aspx
/// </summary>
public class SecurityUtilities
{
[DllImport("advapi32.dll", SetLastError = true)]
private static extern bool LogonUser(string lpszUserName, string lpszDomain, string lpszPassword, int dwLogonType, int dwLogonProvider, out IntPtr phToken);
public delegate void RunAsDelegate();
public static void RunAs(RunAsDelegate methodToRunAs, string username, string password)
{
string userName;
string domain;
if (username.IndexOf('\\') > 0)
{
//a domain name was supplied
string[] usernameArray = username.Split('\\');
userName = usernameArray[1];
domain = usernameArray[0];
}
else
{
//there was no domain name supplied
userName = username;
domain = ".";
}
RunAs(methodToRunAs, userName, password, domain);
}
public static void RunAs(RunAsDelegate methodToRunAs, string username, string password, string domain)
{
IntPtr userToken;
WindowsIdentity adminIdentity = null;
WindowsImpersonationContext adminImpersonationContext = null;
try
{
if (LogonUser(username, string.IsNullOrEmpty(domain) ? "." : domain, password, 9, 0, out userToken))
{
//the impersonation suceeded
adminIdentity = new WindowsIdentity(userToken);
adminImpersonationContext = adminIdentity.Impersonate();
// todo: Entfernen.
WindowsPrincipal p = new WindowsPrincipal(adminIdentity);
MessageBox.Show(p.IsInRole(WindowsBuiltInRole.Administrator).ToString());
//run the delegate method
//methodToRunAs();
}
else
throw new Exception(string.Format("Could not impersonate user {0} in domain {1} with the specified password.", username, domain));
}
catch (Exception se)
{
int ret = Marshal.GetLastWin32Error();
if (adminImpersonationContext != null)
adminImpersonationContext.Undo();
throw new Exception("Error code: " + ret.ToString(), se);
}
finally
{
//revert to self
if (adminImpersonationContext != null)
adminImpersonationContext.Undo();
}
}
}
}
net use /U
). Если вы хотите зарегистрировать пользователя на локальном компьютере, используйте ИНТЕРАКТИВНЫЙ тип входа, предложенный rdkleine. - person Anton Tykhyy   schedule 28.06.2012