Измените содержимое файла 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 после внесения этих изменений.
Похоже, вы хотите выдать себя за администратора. Вот статья и демонстрация . Похоже, что он написан на .Net 1, но с этого следует начать. Также ознакомьтесь с классом WindowsIdentity .
Вам не нужно использовать службу Windows, чтобы делать что-то от имени другого человека. Вы можете использовать олицетворение, чтобы войти в систему как другой пользователь, чтобы выполнить фактическое переключение. Вот пример, который я обнаружил, в котором для входа в систему используется библиотека windows dll "advapi32.dll".
Возьмите образец кода внизу страницы. Я не хотел просто копировать здесь его код.
http://csharptuning.blogspot.com/2007/06/impersonation-in-c.html
Одна проблема с олицетворением заключается в том, что компьютер, выполняющий олицетворение, должен находиться в том же домене, что и пользователь, вы выдаете себя за другое лицо.
Цель этого приложения кажется мне неправильной. По сути, вы пытаетесь создать средство, позволяющее пользователям, не являющимся администраторами, разблокировать учетные записи ... что по уважительной причине является функцией, недоступной для обычных пользователей.
Вы не можете использовать службу Windows (легко), поскольку служба Windows не может иметь графический интерфейс. Единственный способ сделать это в качестве службы - это установить службу, а затем создать приложение с графическим интерфейсом пользователя, которое использовало бы IPC для передачи запроса службе. Однако это может открыть потенциальную лазейку.
Если вы работаете в Vista, хорошим вариантом будет отредактировать файл манифеста и добавить requireAdministrator.
Изменить:
Это звучит так, что мое первое предложение может быть тем, что вы хотите ... Для этого основной процесс:
Затем вы можете запустить клиент как обычный пользователь (поскольку ему просто нужно разговаривать со службой, он не делает ничего, что требует разрешений).
Этот код позволит вам вызвать другой исполняемый файл и запустить его от имени администратора.
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
}
Не совсем то, что вы ищете, но это возможное решение.
У меня есть очень похожий виджет на моем сайте в интрасети, поэтому сотрудники ИТ-отдела, находящиеся в разных часовых поясах, могут выполнять сброс пароля, который также выполняет разблокировку учетной записи, когда администраторы домена на западном побережье недоступны. Это довольно простые задачи, и вот за исключением того, как я это сделал ...
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 часа утра, чтобы сбросить пароль.
Вот класс, который я использую для олицетворения на веб-сайте 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();
}
}