在没有用户名和密码的C#中执行Powershell脚本

本文关键字:执行 Powershell 脚本 密码 用户 | 更新日期: 2023-09-27 18:21:40

如何在不使用用户名和密码的情况下在C#中执行Powershell脚本?

Powershell脚本:

#Script:This Script generate the Package (Zip file) dynamically for unittest 
#DirectoryName is Out Directory of Unittest execution
#location  is Out'Resource Directory
#locationdetail is Array of files Directory for generate the Package
#FileName is name of Package generated through this script
#option is use for switch case implementation,currently not implemented 
 param(   
        [string]$DirectoryName="."
    ,   [string]$location=""
    ,   [string]$FileName="Test.zip"
    ,   [int] $option
)
 [System.Reflection.Assembly]::LoadFrom($DirectoryName+"''"+"Ionic.Zip.dll");
  $locationdetail =  "Package''Resource", "Package''ResourceBad", "Package''ResourceEmptymetada","Package''ResourceEmptydatafile","Package''EmptyTest"
  $directoryToZip=""
  foreach ($element in $locationdetail) 
  {
    If($element -eq "Package''Resource")
    {
        $directoryToZip= $location+"''"+"Package''Resource"
        $FileName ="Package (Good Data).zip"        
    }
    If($element -eq "Package''ResourceBad")
    {
        $directoryToZip= $location+"''"+"Package''ResourceBad"
        $FileName ="Package (Bad Data).zip"     
    }
    If($element -eq "Package''ResourceEmptymetada")
    {
        $directoryToZip= $location+"''"+"Package''ResourceEmptymetada"
        $FileName ="Package (Bad with ManifestEmpty).zip"               
    }
    If($element -eq "Package''ResourceEmptydatafile")
    {
        $directoryToZip= $location+"''"+"Package''ResourceEmptydatafile"
        $FileName ="Package (Bad with Datafile Empty).zip"      
    }
    If($element -eq "Package''EmptyTest")
    {
        $directoryToZip= $location+"''"+"Package''EmptyTest"
        $FileName ="EmptyTest.zip"      
    }
    $zipfile =  new-object Ionic.Zip.ZipFile
    $e= $zipfile.AddDirectory($directoryToZip)
    $zipfile.Save( $location+"''"+$FileName)
    $zipfile.Dispose()
    $directoryToZip=""
  }

和我的C#代码

private static void StartPowerShell(string args,string TempScript)
    {
        string powerShellPath ="C:'Windows'System32'WindowsPowerShell'v1.0'powershell.exe";
        string commandLine = @" -Sta -Command ""& {{ try {{ {0} }} catch {{throw}} }} """.InvariantCultureFormat(args);
        var info = new ProcessStartInfo();
        info.FileName = powerShellPath;
        info.Arguments = commandLine;
        info.WorkingDirectory = Environment.CurrentDirectory;
        info.UseShellExecute = false;
        info.CreateNoWindow = false;
        info.RedirectStandardError = true;
        info.RedirectStandardOutput = true;
        //Pass the Username and Password here in  ProcessStartInfo
        info.UserName = "Saroop";
        string pw = "saroop";
        System.Security.SecureString password = new System.Security.SecureString();
        foreach (var item in pw)
        {
            password.AppendChar(item);
        }
        info.Password = password;
        info.RedirectStandardError = true;
        info.RedirectStandardOutput = true;
        Process p = new Process();
        p.StartInfo = info;
        bool flag = p.Start();
        string error = p.StandardError.ReadToEnd();
        p.WaitForExit();
    }

任何人都请给我指路。我尝试使用runas命令以用户(管理员)身份启动Powershell.exe,但它也要求输入用户名和密码。我尝试使用System.Management.Automation.dll,但它已不存在于.Net 4.0中参考链接:http://msdn.microsoft.com/en-us/library/system.management.automation(v=vs.85).aspx

请帮帮我。

在没有用户名和密码的C#中执行Powershell脚本

您在注释中所写的内容会起作用,但我想为您提供从C#代码运行powershell脚本的另一个方向。

您可以使用System.Management.Automation.Runspaces命名空间,它提供了一种非常简单、更优雅的方式来运行powershell命令并从C#检索结果(并使用返回的对象,而不仅仅是输出文本流)。试着读一下。

我找到了查询的答案。要执行,POWERSHELL脚本必须执行的POLICY命令系统32C: ''Windows''System32''WindowsPowerShell''v1.0''powershell.exe若您的系统是64位的,那个么也要为64位POWERSHELL.EXE执行相同的策略。C: ''Windows''SysWOW64''WindowsPowerShell''v1.0''POWERSHELL.EXE

    /// COMMAND : `Set-ExecutionPolicy Unrestricted`