我想使用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中工作。但不在窗口服务..
答案 0 :(得分:0)
产生的错误会有所帮助。
Sitename也不是变量,是atypo在这里还是在代码中?
你可以尝试用\ n替换\ n;同样,powershell不会将其用作新行,但我猜C#是。
答案 1 :(得分:0)
这里有几点需要注意,我想您可能不了解Windows服务的某些方面:
OnStart
不是放置任何逻辑的地方。此事件在那里,您可以初始化服务。例如,启动后台工作线程,该线程将运行服务的主要逻辑并响应外部请求。例如 - 启动TCP侦听器或初始化.NET Remoting或WCF。
OnStart
仅在服务启动时调用一次。
OnStart
必须在30秒内返回,尽管您的初始化代码可以request additional time。
您正在呼叫PowerShell和WebAdministration插件来创建网站。虽然这是可行的,但它很笨重,也许您应该考虑直接调用IIS7 Managed API:
以下是使用托管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
帐户下运行服务。