Я думаю, что вы на правильном пути, проблема с «Access denied» связана с процессом ASP.NET, запущенным с пользователем ASPNET, который имеет ограниченные права, и это то, что вы получаете ошибку. Что вы можете сделать, так это настроить imersnation для вашего веб-приложения. Это можно сделать либо путем изменения web.config, либо в коде. Подробнее о олицетворения вы можете прочитать here
web.comfig является realtively просто, вам нужно добавить следующую строку в раздел system.web вашего web.config
<identity impersonate="true" userName="domain\user" password="password" />
пользователь должен иметь права администратора на сервер
, если вы хотите, чтобы выполнить олицетворение в коде ниже приведен пример того, как вы могли бы сделать это:
...
WindowsImpersonationContext context = ImpersonateUser("domain", "user", "password");
// kill your process
context.Undo();
...
[DllImport("advapi32.dll")]
private static extern bool LogonUser(
String lpszUsername, String lpszDomain, String lpszPassword,
int dwLogonType, int dwLogonProvider, ref IntPtr phToken);
[DllImport("advapi32.dll")]
private static extern bool DuplicateToken(
IntPtr ExistingTokenHandle, int ImpersonationLevel,
ref IntPtr DuplicateTokenHandle);
[DllImport("kernel32.dll")]
private static extern bool CloseHandle(IntPtr hObject);
private enum SecurityImpersonationLevel
{
SecurityAnonymous,
SecurityIdentification,
SecurityImpersonation,
SecurityDelegation
}
private enum LogonTypes
{
LOGON32_PROVIDER_DEFAULT=0,
LOGON32_LOGON_INTERACTIVE=2,
LOGON32_LOGON_NETWORK=3,
LOGON32_LOGON_BATCH=4,
LOGON32_LOGON_SERVICE=5,
LOGON32_LOGON_UNLOCK=7,
LOGON32_LOGON_NETWORK_CLEARTEXT=8,
LOGON32_LOGON_NEW_CREDENTIALS=9
}
public static WindowsImpersonationContext ImpersonateUser(string domain, string username, string password)
{
WindowsImpersonationContext result = null;
IntPtr existingTokenHandle = IntPtr.Zero;
IntPtr duplicateTokenHandle = IntPtr.Zero;
try
{
if (LogonUser(username, domain, password,
(int)LogonTypes.LOGON32_LOGON_NETWORK_CLEARTEXT, (int)LogonTypes.LOGON32_PROVIDER_DEFAULT,
ref existingTokenHandle))
{
if (DuplicateToken(existingTokenHandle,
(int)SecurityImpersonationLevel.SecurityImpersonation,
ref duplicateTokenHandle))
{
WindowsIdentity newId = new WindowsIdentity(duplicateTokenHandle);
result = newId.Impersonate();
}
}
}
finally
{
if (existingTokenHandle != IntPtr.Zero)
CloseHandle(existingTokenHandle);
if (duplicateTokenHandle != IntPtr.Zero)
CloseHandle(duplicateTokenHandle);
}
return result;
}
надежды этого помогает, считает
Итак ... это консольное приложение C# или приложение ASP.NET? Это имеет значение для ответа. –
это приложение ASP.NET. однако я тоже могу сделать это из консольного приложения ... поэтому, если бы вы были так склонны помогать мне, учитывая обе возможности, я был бы очень обязан – HaterTot