服务器上的.NET创建计划任务因E_ACCESSDENIED而失败

时间:2009-01-20 17:43:29

标签: c# .net asp.net permissions scheduled-tasks

我有一个ASP.NET网站(在C#中),它接收用户数据,然后尝试创建一个Windows计划任务。当然,这在DEV机器上运行良好,但无法在服务器上运行。我试图弄清楚ASPNET用户(或匿名网络用户)需要哪些权限来创建任务。

错误是:

Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED)) 
Stacktrace: 
    at MyScheduler.NewWorkItem(String TaskName, Guid& rclsid, Guid& riid, Object& obj) 
    at MyScheduler.CreateTask(String name)

我已经完成了一些搜索,建议的解决方案是使用web.config“impersonate”标志强制应用程序以具有足够权限的用户身份运行,而不是ASPNET帐户可能没有这些权限

示例:

<system.web>
    <identity impersonate="true" />
</system.web> 

不幸的是,这似乎没有解决问题。从我阅读的文档中,这应该作为匿名Web用户运行,但似乎用户没有足够的权限。

我更改了设置,以指定恰好是计算机管理员的特定域用户。例如:

<system.web>
    <identity impersonate="true" userName="WindowsDomain\YourUserName" password="YourPassword" />
</system.web> 

这样做可以让应用程序成功创建Windows计划任务。因此,显然,使用正确的Windows 2003权限集,我可以让应用程序像在开发环境中一样执行。但是,我不打算将网络或计算机管理员帐户的用户凭据以纯文本形式放在Web.config文件中。

是否有人碰巧知道确实需要设置哪些权限才能让ASPNET帐户按照需要运行?

编辑: Win32 API用于创建计划任务。

4 个答案:

答案 0 :(得分:1)

您的内部流程是否允许您创建特定于计算机的帐户并在那里提供凭据,而不是担心ASPNET用户权限?

答案 1 :(得分:1)

我已经能够解决我的特定问题,但并非完全如此。我还没有确定创建和运行计划任务所需的确切权限,但以下似乎有效:

  1. <identity impersonate="true" />添加到Web.config
  2. 将IUSR用户(应用程序将使用模拟运行的用户)添加到“备份操作员”组。
  3. 这使应用程序可以访问“计划任务”文件夹,以便他们可以创建和运行任务。

    我们还有一个问题,即任务试图作为本地系统帐户运行。遗憾的是,只有管理员似乎能够将本地系统帐户指定为正在运行的用户,因此我们需要模拟管理员帐户,而不是备份操作员才能使我们的代码正常运行。

答案 2 :(得分:0)

你在为活动日志写点什么吗? 您的组件(在我假设的IIS中托管?)可能无法访问事件日志中的内容。

这只是一个猜测〜前一段时间,我遇到过类似的问题,我已经用这种方式解决了这个问题:

Click

答案 3 :(得分:-4)

另一种选择是在服务器上刷新BIOS