无法在窗口服务中使用powershell创建网站

时间:2011-08-22 05:26:10

标签: c#-4.0 powershell

我想使用powershell脚本在IIS中创建一个网站。我在窗口服务中编写此代码。

protected override void OnStart(string[] args)
    {
        string sitename = "rajesh";
        //To create a New site
        //Powershell script
      string script = "cd\\\n" + "import-Module WebAdministration \n" + "IIS:\n" + "New-item iis:\\Sites\\rajesh -PhysicalPath C:\\inetpub\\wwwroot\test -bindings @{Protocol='http';bindingInformation='*:8080:" + sitename + "'}" + "\n add-content C:\\Windows\\System32\\drivers\\etc\\Hosts '127.0.0.1 " + sitename + "'";

    string s = RunScript(script);

    }

    private static string RunScript(string scriptText)
    {
        Runspace runspace = RunspaceFactory.CreateRunspace();
        runspace.Open();
        Pipeline pipeline = runspace.CreatePipeline();
        pipeline.Commands.AddScript(scriptText);
        pipeline.Commands.Add("Out-String");            
        Collection<PSObject> results = pipeline.Invoke();
        runspace.Close();
        StringBuilder stringBuilder = new StringBuilder();
        foreach (PSObject obj in results)
        {
            stringBuilder.AppendLine(obj.ToString());
        }
        return stringBuilder.ToString();
    }

但是当我尝试在服务列表中启动此窗口服务时...它会抛出错误.. locat计算机上的服务启动和停止.....当我将powershell脚本更改为创建文件夹或某些小任务然后这个窗口服务工作,但当我尝试通过此powershell创建一个网站..它抛出一个错误,窗口服务无法启动。这个powershell脚本在powershell中工作。但不在窗口服务..

2 个答案:

答案 0 :(得分:0)

产生的错误会有所帮助。

Sitename也不是变量,是atypo在这里还是在代码中?

你可以尝试用\ n替换\ n;同样,powershell不会将其用作新行,但我猜C#是。

答案 1 :(得分:0)

这里有几点需要注意,我想您可能不了解Windows服务的某些方面:

  1. OnStart不是放置任何逻辑的地方。此事件在那里,您可以初始化服务。例如,启动后台工作线程,该线程将运行服务的主要逻辑并响应外部请求。例如 - 启动TCP侦听器或初始化.NET Remoting或WCF。

  2. OnStart仅在服务启动时调用一次。

  3. OnStart必须在30秒内返回,尽管您的初始化代码可以request additional time

  4. 您正在呼叫PowerShell和WebAdministration插件来创建网站。虽然这是可行的,但它很笨重,也许您应该考虑直接调用IIS7 Managed API:

      

    Microsoft.Web.Administration Namespace

    以下是使用托管API创建网站的示例:

    using (ServerManager serverManager = new ServerManager())
    {
      Site site = serverManager.Sites.Add("My Web Site", "C:\\inetpub\\wwwroot\test", 80);
      site.Bindings.Clear();
      site.Bindings.Add("*:8080:", "http");
      serverManager.CommitChanges();
    }
    

    还应注意,在IIS上执行的任何配置任务都要求执行此操作的帐户具有提升的权限,即作为管理员或在SYSTEM帐户下运行服务。