Estoy tratando de ejecutar un script de PowerShell de una aplicación en c#. El script debe ser ejecutado en una especial usercontext.

He probado diferentes escenarios de algunos trabajan, otros no:

1. llamada directa desde PowerShell

He llamado a la secuencia de comandos directamente desde una ps-consola que se está ejecutando bajo la correcta usercredentials.

C:\Scripts\GroupNewGroup.ps1 1

Resultado: con Éxito la ejecución del script.

2. desde una consola de c# aplicación

He llamado a la secuencia de comandos de un c# consoleapplication que se inicia bajo la correcta usercredentials.

Código:

 string cmdArg = "C:\Scripts\GroupNewGroup.ps1 1"
 Runspace runspace = RunspaceFactory.CreateRunspace();
 runspace.ApartmentState = System.Threading.ApartmentState.STA;
 runspace.ThreadOptions = PSThreadOptions.UseCurrentThread;


     runspace.Open();

 Pipeline pipeline = runspace.CreatePipeline();

 pipeline.Commands.AddScript(cmdArg);
 pipeline.Commands[0].MergeMyResults(PipelineResultTypes.Error, PipelineResultTypes.Output);
 Collection<PSObject> results = pipeline.Invoke();
 var error = pipeline.Error.ReadToEnd();
 runspace.Close();

 if (error.Count >= 1)
 {
     string errors = "";
     foreach (var Error in error)
     {
         errors = errors + " " + Error.ToString();
     }
 }

Resultado: Sin Éxito. Y un montón de “Nulo de la Matriz de” excepciones.

3. desde una consola de c# código de la aplicación secundarios de la suplantación de

(http://platinumdogs.me/2008/10/30/net-c-impersonation-with-network-credentials)

He llamado a la secuencia de comandos de un c# consoleapplication que se inicia bajo la correcta usercredentials y el código contiene la suplantación.

Código:

using (new Impersonator("Administrator2", "domain", "testPW"))

                   {
  using (RunspaceInvoke invoker = new RunspaceInvoke()) 
{ 
    invoker.Invoke("Set-ExecutionPolicy Unrestricted"); 
} 

     string cmdArg = "C:\Scripts\GroupNewGroup.ps1 1";
     Runspace runspace = RunspaceFactory.CreateRunspace();
     runspace.ApartmentState = System.Threading.ApartmentState.STA;
     runspace.ThreadOptions = PSThreadOptions.UseCurrentThread;


         runspace.Open();

     Pipeline pipeline = runspace.CreatePipeline();

     pipeline.Commands.AddScript(cmdArg);
     pipeline.Commands[0].MergeMyResults(PipelineResultTypes.Error, PipelineResultTypes.Output);
     Collection<PSObject> results = pipeline.Invoke();
     var error = pipeline.Error.ReadToEnd();
     runspace.Close();

     if (error.Count >= 1)
     {
         string errors = "";
         foreach (var Error in error)
         {
             errors = errors + " " + Error.ToString();
         }
     }
 }  

Resultados:

  • El término ‘Contacto’ no se reconoce como nombre de un cmdlet,
    función, archivo de secuencia de comandos, o un programa ejecutable. Comprobar la ortografía de la
    nombre, o si un camino se ha incluido, compruebe que la ruta es correcta y
    inténtelo de nuevo.
  • El término ‘C:\Scripts\FunctionsObjects.ps1’ no se reconoce como el
    nombre de un cmdlet, función, archivo de secuencia de comandos, o un programa ejecutable. Verificación
    la ortografía del nombre, o si un camino se ha incluido, compruebe que el
    ruta de acceso es correcta e inténtelo de nuevo.
  • Sin complementos se han registrado para la versión 2 de Windows PowerShell.
    Microsoft.De la oficina.Server, Versión=14.0.0.0, Culture=neutral,
    PublicKeyToken=71e9bce111e9429c
  • Sistema.DirectoryServices.AccountManagement, Version=4.0.0.0,
    Culture=neutral, PublicKeyToken=b77a5c561934e089
  • Excepción de llamadas “.cto r” con “1” argumento(s): “La aplicación Web
    en http://XXXX/websites/Test4/ no se pudo encontrar. Compruebe que
    ha escrito la URL correctamente. Si la dirección URL debe ser atendiendo a los actuales
    el contenido, el administrador del sistema puede necesitar agregar una nueva dirección URL de la solicitud
    la asignación para la aplicación prevista.”
  • Usted puede llamar a un método en una expresión con valores null. No index
    en un nulos de la matriz.

Hasta ahora no hay ninguna respuesta

¿Alguien sabe por qué hay diferencias y cómo resolver el problema?

cualquier solución final con el código fuente completo de trabajo ?
Evite llamar a espacio de ejecución.Abierto (a) al personificar.

OriginalEl autor HW90 | 2012-06-20

3 Comentarios

  1. 7

    ¿Has probado Set-ExecutionPolicy Unrestricted

    using ( new Impersonator( "myUsername", "myDomainname", "myPassword" ) ) 
    { 
        using (RunspaceInvoke invoker = new RunspaceInvoke()) 
        { 
            invoker.Invoke("Set-ExecutionPolicy Unrestricted"); 
        } 
    } 

    Edición:

    Encontrado esta pequeña joya… http://www.codeproject.com/Articles/10090/A-small-C-Class-for-impersonating-a-User

    namespace Tools
    {
    #region Using directives.
    //----------------------------------------------------------------------
    using System;
    using System.Security.Principal;
    using System.Runtime.InteropServices;
    using System.ComponentModel;
    //----------------------------------------------------------------------
    #endregion
    /////////////////////////////////////////////////////////////////////////
    ///<summary>
    ///Impersonation of a user. Allows to execute code under another
    ///user context.
    ///Please note that the account that instantiates the Impersonator class
    ///needs to have the 'Act as part of operating system' privilege set.
    ///</summary>
    ///<remarks>   
    ///This class is based on the information in the Microsoft knowledge base
    ///article http://support.microsoft.com/default.aspx?scid=kb;en-us;Q306158
    ///
    ///Encapsulate an instance into a using-directive like e.g.:
    ///
    ///    ...
    ///    using ( new Impersonator( "myUsername", "myDomainname", "myPassword" ) )
    ///    {
    ///        ...
    ///        [code that executes under the new context]
    ///        ...
    ///    }
    ///    ...
    ///
    ///Please contact the author Uwe Keim (mailto:[email protected])
    ///for questions regarding this class.
    ///</remarks>
    public class Impersonator :
    IDisposable
    {
    #region Public methods.
    //------------------------------------------------------------------
    ///<summary>
    ///Constructor. Starts the impersonation with the given credentials.
    ///Please note that the account that instantiates the Impersonator class
    ///needs to have the 'Act as part of operating system' privilege set.
    ///</summary>
    ///<param name="userName">The name of the user to act as.</param>
    ///<param name="domainName">The domain name of the user to act as.</param>
    ///<param name="password">The password of the user to act as.</param>
    public Impersonator(
    string userName,
    string domainName,
    string password )
    {
    ImpersonateValidUser( userName, domainName, password );
    }
    //------------------------------------------------------------------
    #endregion
    #region IDisposable member.
    //------------------------------------------------------------------
    public void Dispose()
    {
    UndoImpersonation();
    }
    //------------------------------------------------------------------
    #endregion
    #region P/Invoke.
    //------------------------------------------------------------------
    [DllImport("advapi32.dll", SetLastError=true)]
    private static extern int LogonUser(
    string lpszUserName,
    string lpszDomain,
    string lpszPassword,
    int dwLogonType,
    int dwLogonProvider,
    ref IntPtr phToken);
    [DllImport("advapi32.dll", CharSet=CharSet.Auto, SetLastError=true)]
    private static extern int DuplicateToken(
    IntPtr hToken,
    int impersonationLevel,
    ref IntPtr hNewToken);
    [DllImport("advapi32.dll", CharSet=CharSet.Auto, SetLastError=true)]
    private static extern bool RevertToSelf();
    [DllImport("kernel32.dll", CharSet=CharSet.Auto)]
    private static extern  bool CloseHandle(
    IntPtr handle);
    private const int LOGON32_LOGON_INTERACTIVE = 2;
    private const int LOGON32_PROVIDER_DEFAULT = 0;
    //------------------------------------------------------------------
    #endregion
    #region Private member.
    //------------------------------------------------------------------
    ///<summary>
    ///Does the actual impersonation.
    ///</summary>
    ///<param name="userName">The name of the user to act as.</param>
    ///<param name="domainName">The domain name of the user to act as.</param>
    ///<param name="password">The password of the user to act as.</param>
    private void ImpersonateValidUser(
    string userName, 
    string domain, 
    string password )
    {
    WindowsIdentity tempWindowsIdentity = null;
    IntPtr token = IntPtr.Zero;
    IntPtr tokenDuplicate = IntPtr.Zero;
    try
    {
    if ( RevertToSelf() )
    {
    if ( LogonUser(
    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();
    }
    else
    {
    throw new Win32Exception( Marshal.GetLastWin32Error() );
    }
    }
    else
    {
    throw new Win32Exception( Marshal.GetLastWin32Error() );
    }
    }
    else
    {
    throw new Win32Exception( Marshal.GetLastWin32Error() );
    }
    }
    finally
    {
    if ( token!= IntPtr.Zero )
    {
    CloseHandle( token );
    }
    if ( tokenDuplicate!=IntPtr.Zero )
    {
    CloseHandle( tokenDuplicate );
    }
    }
    }
    ///<summary>
    ///Reverts the impersonation.
    ///</summary>
    private void UndoImpersonation()
    {
    if ( impersonationContext!=null )
    {
    impersonationContext.Undo();
    }   
    }
    private WindowsImpersonationContext impersonationContext = null;
    //------------------------------------------------------------------
    #endregion
    }
    /////////////////////////////////////////////////////////////////////////
    }
    Sí, yo ya la ExecutionPolicy con la mano. Pero yo lo he probado ahora en el código, pero sin ningún éxito: la he puesto en mis preguntas de código.

    OriginalEl autor Chris Gessler

  2. 5

    Acabo de pasar el día en la fijación de esto por mí mismo.

    Que finalmente fue capaz de hacer que funcione mediante la adición de -Ámbito de aplicación el Proceso de a Set-ExecutionPolicy

    invoker.Invoke("Set-ExecutionPolicy Unrestricted -Scope Process"); 
    gracias, ya esta resuelto mi problema después de ver que tenía que usar “Set-ExecutionPolicy sin restricciones” en un centenar de sitios, el Alcance del Proceso que hizo por mí!

    OriginalEl autor Gunnar Steinn

  3. 0

    Several PowerShell cmddlets take a PSCredential object to run using a particular user account. Puede echar un vistazo a este artículo:
    http://letitknow.wordpress.com/2011/06/20/run-powershell-script-using-another-account/

    He aquí cómo usted puede crear el objeto de Credencial que contiene el nombre de usuario y la contraseña que usted desea utilizar:

    $username = 'domain\user'
    $password = 'something'
    $cred = New-Object System.Management.Automation.PSCredential -ArgumentList @($username,(ConvertTo-SecureString -String $password -AsPlainText -Force))

    Una vez que usted tiene la contraseña listo para su uso en un objeto de credenciales, usted puede hacer un número de cosas, tales como el Inicio de la llamada-Proceso para el lanzamiento de PowerShell.exe, especificando la credencial en el parámetro de Credencial, o Invocar el Comando para invocar una “distancia” comando localmente, specifying the credential in the -Credential parameter, o usted puede llamar a Start-Trabajo para hacer el trabajo como un job de fondo, passing the credentials you want into the -Credential parameter.

    Ver aquí , aquí & en msdn para más información

    OriginalEl autor Angshuman Agarwal

Dejar respuesta

Please enter your comment!
Please enter your name here