用于在ASP.net Web应用程序中启动Windows服务的安全设置

时间:2009-10-20 22:43:46

标签: asp.net security

我在内部ASP.net应用程序中有一些代码,如果它们在运行Web应用程序的服务器上停止,我们将使用它来启动自动服务。唯一的问题是它在服务器上运行时似乎没有启动服务。当它在我的桌面本地运行时它确实很好,所以我猜我必须给ASP.net用户提供某些安全设置?

这是我的代码:

protected void StartService(object sender, EventArgs e)
{
    LinkButton serviceButton = (LinkButton)sender;
    string name = serviceButton.ID;

    ManagementPath path = new ManagementPath();

    path.Server = System.Environment.MachineName;

    path.NamespacePath = @"root\CIMV2";

    path.RelativePath = "Win32_service.Name='" + name + "'";

    ManagementObject service = new ManagementObject(path);

    ManagementBaseObject temp = service.InvokeMethod("StartService", null, null);

    Thread.Sleep(100);

    GetStoppedServices();
}

任何人对如何使其发挥作用有任何想法?

编辑:为了澄清,网络应用程序与我想要启动服务的服务器在同一台服务器上运行。

编辑2:有一个脑波,并尝试使用此代码..没有骰子。

    ProcessInfo = new ProcessStartInfo("cmd.exe", "/C net start " + name);
    ProcessInfo.CreateNoWindow = true;
    ProcessInfo.UseShellExecute = false;
    Process = Process.Start(ProcessInfo);
    Process.Close();

3 个答案:

答案 0 :(得分:1)

可能是访问权限问题。当您在本地运行应用程序(通过Visual Studio和内置的Cassini Web服务器)时,我认为您正在以自己的身份运行它,因此它可以正常工作。

当您通过IIS(在服务器上)运行应用程序时,它将作为应用程序池中指定的任何用户运行。 (我认为它默认为“网络服务”)。检查它在IIS中的用户并尝试授予该用户启动服务的权限。

您运行的是哪个版本的IIS?如果它是一个Win 2K3服务器,我猜6.0。

有关配置应用程序池的信息:

编辑:您可以使用SubInACL.exe(微软工具)配置服务权限:

  

因此,假设您拥有“Johnny”用户,并且您希望Johnny能够停止并启动World Wide Web Publishing服务。只需运行以下subinacl.exe命令:

     

subinacl / service W3SVC / GRANT = YOURDOMAIN \ Johnny = TO

     

显然,您需要将YOURDOMAIN替换为域名。最后的TO是标识符,告诉subinacl您实际想要授予Johnny的操作。 T用于“开始服务”,O用于“停止服务”。

有关更多信息,请查看Ingmar的blog post

答案 1 :(得分:1)

适用于Windows 7,Windows Server 2008,Windows Server 2008 R2,Windows Vista

  1. 打开IIS管理器。(从开始 - >运行 - >输入inetmgr并按回车键)

  2. 在“连接”窗格中,展开服务器节点,然后单击“应用程序池”。

  3. 在“应用程序池”页面上,选择要为其指定标识的应用程序池,然后单击“操作”窗格中的“高级设置”。

  4. 对于Identity属性,单击“...”按钮以打开“应用程序池标识”对话框。

  5. 如果要使用内置帐户,请选择内置帐户选项,然后从列表中选择一个帐户。从列表中选择本地系统

  6. 如果要使用自定义标识,请选择“自定义帐户”选项,然后单击“设置”以打开“设置凭据”对话框。然后在“用户名”文本框中键入自定义帐户名,在“密码”文本框中键入密码,在“确认密码”文本框中重新键入密码,然后单击“确定”。

  7. 单击“确定”关闭“应用程序池标识”对话框。

  8. 右键单击应用程序拉动,然后停止并再次单击开始

答案 2 :(得分:0)

不要使用System.Management对象来控制服务,而是查看ServiceController类。开始/停止/暂停的所有方法都是可用的,并且结构更加结构化。

但是,您可能仍会遇到权限问题。您的Web应用程序的执行帐户将需要权限来控制您希望影响的目标服务。

根据您的平台(Win Serv的哪个版本),将针对您的Web应用程序的匿名请求执行不同的帐户。验证哪些帐户发挥作用(或者如果您有经过身份验证的请求,您了解您的用户)并确定其对Windows服务的权限。