Запуск от имени администратора: requireAdministrator & ClickOnce + эмуляция системного времени
В моем приложении используется технология ClickOnce. Сегодня мне нужно было запустить его как администратор. Я изменил файл манифеста с
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
к
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
Однако VS не может скомпилировать проект:
Ошибка 35 ClickOnce не поддерживает уровень выполнения запроса "requireAdministrator".
Я думаю, что невозможно использовать их сразу. Не так ли? Мне нужно изменить системное время, могу ли я сделать это на уровне приложений? Могу ли я подражать этому, так что приложение. может делать то, что я хочу. Я изменяю время +2 часа, а затем возвращаю на секунду. У меня есть несколько dll, и они просят время.
Ответы
Ответ 1
Время - общесистемная вещь, вы не можете изменить ее только для своего процесса. Единственный способ лгать об этом своим зависимостям - это подключить API, используя Detours или что-то подобное. Не разрешается, если вы являетесь скромной учетной записью пользователя.
Для изменения времени требуются привилегии "Изменить системное время" и/или "Изменить часовые пояса" (которые обычно предоставляются учетной записью администратора).
И как упоминалось @Chris, admin и ClickOnce несовместимы.
Ответ 2
На самом деле вы не можете запускать приложение ClickOnce с правами администратора, но есть небольшой взлом, вы можете запустить новый процесс с правами администратора.
В App_Startup:
if (!IsRunAsAdministrator())
{
var processInfo = new ProcessStartInfo(Assembly.GetExecutingAssembly().CodeBase);
// The following properties run the new process as administrator
processInfo.UseShellExecute = true;
processInfo.Verb = "runas";
// Start the new process
try
{
Process.Start(processInfo);
}
catch (Exception)
{
// The user did not allow the application to run as administrator
MessageBox.Show("Sorry, this application must be run as Administrator.");
}
// Shut down the current process
Application.Current.Shutdown();
}
private bool IsRunAsAdministrator()
{
var wi = WindowsIdentity.GetCurrent();
var wp = new WindowsPrincipal(wi);
return wp.IsInRole(WindowsBuiltInRole.Administrator);
}
Прочитать полную статью.
Но если вы хотите, чтобы более простое и простое решение просто попросило пользователя запустить Internet Explorer в качестве администратора, инструмент ClickOnce также будет работать с правами администратора.
Ответ 3
Правильно - ClickOnce не может работать с правами администратора. Фактически, он предназначен не для.
Ответ 4
private void Form1_Load(object sender, EventArgs e)
{
if (WindowsIdentity.GetCurrent().Owner == WindowsIdentity.GetCurrent().User) // Check for Admin privileges
{
try
{
this.Visible = false;
ProcessStartInfo info = new ProcessStartInfo(Application.ExecutablePath); // my own .exe
info.UseShellExecute = true;
info.Verb = "runas"; // invoke UAC prompt
Process.Start(info);
}
catch (Win32Exception ex)
{
if (ex.NativeErrorCode == 1223) //The operation was canceled by the user.
{
MessageBox.Show("Why did you not selected Yes?");
Application.Exit();
}
else
throw new Exception("Something went wrong :-(");
}
Application.Exit();
}
else
{
// MessageBox.Show("I have admin privileges :-)");
}
}
Ответ 5
Если вы запускаете приложение ClickOnce из IE, чтобы иметь права администратора, просто запускайте IE с правами администратора, и ваше приложение также будет иметь его.