从Web页面执行远程Powershell命令

时间:2016-01-06 13:13:16

标签: c# asp.net asp.net-mvc

Backgroud:我是公司的高级系统管理员。对于Powershell和Bash,我是新手,但在Web开发方面有0经验。我对OOP很熟悉。

要求:用户需要访问远程Win服务器上的非常具体的任务,例如运行某些计划任务,检查某些URL,回收IIS应用程序池等。所有这些都可以使用Powershell轻松编写脚本。 而不是让用户直接访问脚本,掩盖Web门户后面的所有内容。然后在使用LDAP进行身份验证后,会向用户显示一组预先设置的脚本,他们可以直接从门户网站运行。

挑战:在没有事先编程经验的情况下自己完成这项工作。

问题:我从哪里开始?我是否首先开始学习C#? ASP .NET? MVC? JavaScript的? HTML?我很失落,很欣赏一些一般指导。

2 个答案:

答案 0 :(得分:1)

看看Powershell Web Access。也许这是一种避免学习你提到的所有技术的方法。

答案 1 :(得分:0)

我是.Net Developer,一旦我有任务让MVC UI与Microsoft Exchange服务器交互并管理AD用户的邮箱,我必须学习powershell以及如何通过C#与powershell交互。因此,根据我的经验,我将建议您开始学习C#使用控制台应用程序,了解c#如何与Powershell和AD一起使用,而不是开始学习MVC来构建UI。

您应该从NuGet包管理器安装System.management.Automation包。

C#=> Powershell(执行Powershell命令)=> Microsoft Exchange。

简单示例,获取用户PrimarySmtpAddress属性。

using System.Management.Automation;
using System.Management.Automation.Runspaces;

private static WSManConnectionInfo _connectionInfo;

static void Main(string[] args)
{
    string userName = "DOMAIN\\User";
    string password = "UserPassowrd";
    PSCredential psCredential = new PSCredential(userName, GenerateSecureString(password));

    _connectionInfo = new WSManConnectionInfo(
            new Uri("http://server.domain.local/PowerShell"),
            "http://schemas.microsoft.com/powershell/Microsoft.Exchange", psCredential);
    _connectionInfo.AuthenticationMechanism = AuthenticationMechanism.Kerberos;

    Console.WriteLine(GetPrimarySmtpAddressBy("Firstname Lastname");
}

public static string GetPrimarySmtpAddressBy(string identity)
    {
        using (Runspace runspace = RunspaceFactory.CreateRunspace(_connectionInfo))
        {

            using (PowerShell powerShell = PowerShell.Create())
            {
                powerShell.AddCommand("Get-Mailbox");
                powerShell.AddParameter("Identity", identity);
                runspace.Open();

                powerShell.Runspace = runspace;

                PSObject psObject = powerShell.Invoke().FirstOrDefault();

                if (psObject != null && psObject.Properties["PrimarySmtpAddress"] != null)
                    return psObject.Properties["PrimarySmtpAddress"].Value.ToString();
                else return "";
            }
        }
    }

public static System.Security.SecureString GenerateSecureString(string input)
    {
        System.Security.SecureString securePassword = new System.Security.SecureString();
        foreach (char c in input)
            securePassword.AppendChar(c);
        securePassword.MakeReadOnly();

        return securePassword;
    }