2011-07-21 11 views
6

Me encuentro con un error algo extraño al realizar la suplantación en PowerShell y C#. Ejecutar el siguiente código no muestra ningún error.Suplantación de identidad arroja FileNotFoundException con WindowsIdentity en Powershell

PSObject result = null; 
using (PowerShell powershell = PowerShell.Create()) 
{ 
    RunspaceConfiguration config = RunspaceConfiguration.Create(); 
    powershell.Runspace = RunspaceFactory.CreateRunspace(config); 
    powershell.Runspace.Open(); 
    powershell.AddScript(String.Format(CmdletMap[PSVocab.OsBootTime], 
         this.ComputerName)); 
    result = powershell.Invoke().First(); 
    powershell.Runspace.Close(); 
} 

return DateTime.Parse(result.ToString()); 

donde la secuencia de comandos para PS CmdletMap[PSVocab.OsBootTime] es simplemente:

$info = Get-WmiObject -Class Win32_OperatingSystem -ComputerName $computer 
     ; $info.ConvertToDateTime($info.LastBootUpTime) 

El código C# anterior funciona correctamente a nivel local. Sin embargo, una vez que tuve este mismo bloque con Windows suplantación de este modo:

WindowsIdentity ImpersonatedIdentity = new WindowsIdentity(ImpersonateUserName); 
WindowsImpersonationContext impersonatedContext 
    = ImpersonatedIdentity.Impersonate(); 
try 
{ 
PSObject result = null; 
using (PowerShell powershell = PowerShell.Create()) 
{ 
    RunspaceConfiguration config = RunspaceConfiguration.Create(); 
    powershell.Runspace = RunspaceFactory.CreateRunspace(config); 
    powershell.Runspace.Open(); 
    powershell.AddScript(String.Format(CmdletMap[PSVocab.OsBootTime], 
          this.ComputerName)); 
    result = powershell.Invoke().First(); 
    powershell.Runspace.Close(); 
} 

return DateTime.Parse(result.ToString()); 
} catch (Exception ex) { // do logging here } 

me sale el siguiente excepción:

FileNotFoundException: C:\Windows\assembly\GAC_MSIL\System.Management.Automation\1.0.0.0__31bf3856ad364e35\System.Management.Automation.dll 

y depuración muestra que se produce un error en RunspaceConfiguration.Create(). Sin embargo, no estoy seguro de por qué.

La DLL aunque ya está registrada en el GAC, así como también se hace referencia en el proyecto en sí. También confirmó que las rutas y la versión son correctas.

Referencias tomadas de:

¿Puede alguien dar una idea de esto?

Respuesta

0

Es posible que el usuario al que se está haciendo pasar no tenga suficientes permisos para acceder a los archivos necesarios de powershell en el GAC.

Como una instantánea intenta darle al usuario (te estás haciendo pasar por) derechos de administrador local para ver si funciona en ese momento. Funciona, revocar los derechos de administrador local y agregar permisos de archivos según sea necesario.

Cuestiones relacionadas