2011-08-22 71 views
1

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

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中工作。但不是在窗口服务..

回答

0

产生的错误将会有所帮助。

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

您可以尝试用\ n替换\ n;另外,powershell不会将它用作新行,尽管我猜C#是。

+0

Sitename是可变的...为简单起见,我在这里硬编码....是我用“;”替换了“\ n”但它仍然给出了相同的错误....但是相同的代码成功运行控制台应用程序...我无法找到区别为什么它不能在窗口服务工作.. –

+0

什么是错误? – Matt

+0

有没有错误....当我尝试启动窗口服务,然后它无法启动。当我运行powershell脚本来创建窗口服务的启动方法中的网站..但是当我编写任何其他PowerShell代码除iis网站创建逻辑...然后我的窗口服务运行完美 –

0

有几件事情,这里要注意,我想你也许不了解的Windows服务的某些方面:

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

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

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

您正在调用PowerShell和WebAdministration插件来创建网站。虽然这是可行的,它的笨重,也许你应该考虑直接调用到IIS7托管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 ac下运行的服务计数。