Как запустить c# приложение с администратором creds?

Измените содержимое файла c:\wamp\alias\phpmyadmin.conf на следующее.

<Directory "c:/wamp/apps/phpmyadmin3.4.5/">
    Options Indexes FollowSymLinks MultiViews
    AllowOverride all
        Order Deny,Allow
        Allow from all
</Directory>

Здесь моя установка WAMP находится в папке c: \ wamp. Измените его в соответствии с вашей установкой.

Ранее это было примерно так:

<Directory "c:/wamp/apps/phpmyadmin3.4.5/">
    Options Indexes FollowSymLinks MultiViews
    AllowOverride all
        Order Deny,Allow
    Deny from all
    Allow from 127.0.0.1
</Directory>

Перезагрузите сервер Apache после внесения этих изменений.

6
задан Sildoreth 6 April 2015 в 18:43
поделиться

7 ответов

Похоже, вы хотите выдать себя за администратора. Вот статья и демонстрация . Похоже, что он написан на .Net 1, но с этого следует начать. Также ознакомьтесь с классом WindowsIdentity .

1
ответ дан 8 December 2019 в 18:41
поделиться

Вам не нужно использовать службу Windows, чтобы делать что-то от имени другого человека. Вы можете использовать олицетворение, чтобы войти в систему как другой пользователь, чтобы выполнить фактическое переключение. Вот пример, который я обнаружил, в котором для входа в систему используется библиотека windows dll "advapi32.dll".

Возьмите образец кода внизу страницы. Я не хотел просто копировать здесь его код.

http://csharptuning.blogspot.com/2007/06/impersonation-in-c.html

Одна проблема с олицетворением заключается в том, что компьютер, выполняющий олицетворение, должен находиться в том же домене, что и пользователь, вы выдаете себя за другое лицо.

2
ответ дан 8 December 2019 в 18:41
поделиться

Цель этого приложения кажется мне неправильной. По сути, вы пытаетесь создать средство, позволяющее пользователям, не являющимся администраторами, разблокировать учетные записи ... что по уважительной причине является функцией, недоступной для обычных пользователей.

8
ответ дан 8 December 2019 в 18:41
поделиться

Вы не можете использовать службу Windows (легко), поскольку служба Windows не может иметь графический интерфейс. Единственный способ сделать это в качестве службы - это установить службу, а затем создать приложение с графическим интерфейсом пользователя, которое использовало бы IPC для передачи запроса службе. Однако это может открыть потенциальную лазейку.

Если вы работаете в Vista, хорошим вариантом будет отредактировать файл манифеста и добавить requireAdministrator.


Изменить:

Это звучит так, что мое первое предложение может быть тем, что вы хотите ... Для этого основной процесс:

  • Сделайте ваше приложение службой Windows. В MSDN есть пошаговое руководство по этому процессу .
  • Сделайте так, чтобы ваша служба реагировала на некоторую форму IPC. Вы можете использовать сокеты, каналы или любую другую форму связи. Служба будет "слушать" запрос на разблокировку пользователя, затем выполните это.
  • Установите службу на машине. Это заставит его работать от имени администратора и просто всегда быть включенным.
  • Создайте второе приложение, которое будет действовать как клиент. Используйте ту же технологию IPC для связи с сервером. Это отправит запрос на разблокировку клиента для службы.

Затем вы можете запустить клиент как обычный пользователь (поскольку ему просто нужно разговаривать со службой, он не делает ничего, что требует разрешений).

0
ответ дан 8 December 2019 в 18:41
поделиться

Этот код позволит вам вызвать другой исполняемый файл и запустить его от имени администратора.

try
{
   path = path_to_your_executable;

   ProcessStartInfo myProcess = new ProcessStartInfo(path);
   myProcess.Domain = domain;
   myProcess.UserName = username;
   myProcess.Password = password;
   myProcess.UseShellExecute = false;

   Process.Start(myProcess);
}
catch (Exception myException)
{
   // error handling
}

Не совсем то, что вы ищете, но это возможное решение.

0
ответ дан 8 December 2019 в 18:41
поделиться

У меня есть очень похожий виджет на моем сайте в интрасети, поэтому сотрудники ИТ-отдела, находящиеся в разных часовых поясах, могут выполнять сброс пароля, который также выполняет разблокировку учетной записи, когда администраторы домена на западном побережье недоступны. Это довольно простые задачи, и вот за исключением того, как я это сделал ...

        using System.DirectoryServices;

        // Impersonate the Admin to Reset the Password / Unlock Account //
        // Change variables below.
        ImpersonateUser iu = new ImpersonateUser();
        if (iu.impersonateValidUser("AdminUserName", "DomainName", "AdminPassword"))
        {
            resetPassword("AdminUserName", "AdminPassword", UserToReset, "NewPassword");
            iu.undoImpersonation();
        }

        // Perform the Reset / Unlock //
        public void resetPassword(string username, string password, string acct, string newpassword)
        {
            string Path = // LDAP Connection String
            string Username = username;
            string Password = password;
            string Domain = "DomainName\\"; // Change to your domain name

            DirectoryEntry de = new DirectoryEntry(Path, Domain + Username, Password, AuthenticationTypes.Secure);

            DirectorySearcher ds = new DirectorySearcher(de);

            ds.Filter = "(&(objectClass=user)(|(sAMAccountName=" + acct + ")))";

            ds.PropertiesToLoad.Add("displayName");
            ds.PropertiesToLoad.Add("sAMAccountName");
            ds.PropertiesToLoad.Add("DistinguishedName");
            ds.PropertiesToLoad.Add("CN");

            SearchResult result = ds.FindOne();

            string dn = result.Properties["DistinguishedName"][0].ToString();

            DirectoryEntry uEntry = new DirectoryEntry("LDAP://" + dn, username, password);

            uEntry.Invoke("SetPassword", new object[] { newpassword });
            uEntry.Properties["LockOutTime"].Value = 0;
            uEntry.CommitChanges();
            uEntry.Close();
        }

Я полностью согласен с тем, что это может привести к проблемам безопасности при неправильном использовании, мы регистрируем все изменения и отправляем их по электронной почте администраторам домена (так что их в цикле), и мы автоматически генерируем пароли. Это очень помогло нашему небольшому ИТ-отделу, поскольку администраторам больше не нужно вставать в 4 часа утра, чтобы сбросить пароль.

0
ответ дан 8 December 2019 в 18:41
поделиться

Вот класс, который я использую для олицетворения на веб-сайте ASP.NET 2.0 , работает в Windows 2000.

Пример использования:

if (iu.impersonateValidUser("AdminUserName", "DomainName", "AdminPassword"))
{            
    // Do Something Under Other Users Security Context
    iu.undoImpersonation();
}

Вот и все ... Полный класс ниже.

using System;
using System.Runtime.InteropServices;
using System.Security.Principal;


public class ImpersonateUser
{
    public const int LOGON32_LOGON_INTERACTIVE = 2;
    public const int LOGON32_PROVIDER_DEFAULT = 0;

    WindowsImpersonationContext impersonationContext;

    [DllImport("advapi32.dll")]
    public static extern int LogonUserA(String lpszUserName,
        String lpszDomain,
        String lpszPassword,
        int dwLogonType,
        int dwLogonProvider,
        ref IntPtr phToken);
    [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern int DuplicateToken(IntPtr hToken,
        int impersonationLevel,
        ref IntPtr hNewToken);

    [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern bool RevertToSelf();

    [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
    public static extern bool CloseHandle(IntPtr handle);

    public bool impersonateValidUser(String userName, String domain, String password)
    {
        WindowsIdentity tempWindowsIdentity;
        IntPtr token = IntPtr.Zero;
        IntPtr tokenDuplicate = IntPtr.Zero;

        if (RevertToSelf())
        {
            if (LogonUserA(userName, domain, password, LOGON32_LOGON_INTERACTIVE,
                LOGON32_PROVIDER_DEFAULT, ref token) != 0)
            {
                if (DuplicateToken(token, 2, ref tokenDuplicate) != 0)
                {
                    tempWindowsIdentity = new WindowsIdentity(tokenDuplicate);
                    impersonationContext = tempWindowsIdentity.Impersonate();
                    if (impersonationContext != null)
                    {
                        CloseHandle(token);
                        CloseHandle(tokenDuplicate);
                        return true;
                    }
                }
            }
        }
        if (token != IntPtr.Zero)
            CloseHandle(token);
        if (tokenDuplicate != IntPtr.Zero)
            CloseHandle(tokenDuplicate);
        return false;
    }

    public void undoImpersonation()
    {
        impersonationContext.Undo();
    }
}
2
ответ дан 8 December 2019 в 18:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: