Eu tenho um site onde os usuários podem se representar / autenticar em um servidor remoto e controlar serviços específicos do Windows. isto funciona bem se estou executando o projeto localmentemas quando eu publicar o projeto para o Servidor web tendo Servidor IIS Em execução, fornece uma exceção:
Não é possível abrir o Service Control Manager no computador (nome do computador). Esta operação pode exigir outros privilégios.
Meu trabalho:
Uma classe que representa (funciona bem localmente):
public class ImpersonationUtil { public static bool Impersonate() { string logon = "ADMIN"; string password = "PASS"; string domain = "THEDOMAIN"; IntPtr token = IntPtr.Zero; IntPtr tokenDuplicate = IntPtr.Zero; WindowsImpersonationContext impersonationContext = null; if (LogonUser(logon, domain, password, 2, 0, ref token) != 0) if (DuplicateToken(token, 2, ref tokenDuplicate) != 0) impersonationContext = new WindowsIdentity(tokenDuplicate).Impersonate(); return (impersonationContext != null); } [DllImport("advapi32.dll", CharSet = CharSet.Auto)] public static extern int LogonUser(string lpszUserName, string lpszDomain, string lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken); [DllImport("advapi32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto, SetLastError = true)] public extern static int DuplicateToken(IntPtr hToken, int impersonationLevel, ref IntPtr hNewToken); }
Código para conectar-se aos serviços:
ServiceController controller = new ServiceController("serviceName", "machineAddress"); var status = controller.Status;
Coisas Web.config (para ler e aceitar a representação no servidor web):
<system.webServer>
<validation validateIntegratedModeConfiguration="false"/>
</system.webServer>
Qualquer ajuda?
Respostas:
0 para resposta № 1mudança
if (LogonUser(logon, domain, password, 2, 0, ref token) != 0)
para
if (LogonUser(logon, domain, password, 9, 0, ref token) != 0)
Não testado, mas acho que deve se conectar agora.