【发布时间】:2016-06-03 11:43:29
【问题描述】:
我正在开发一个 Windows 服务,它将每 5 分钟获取一次 IIS 应用程序池状态信息,并存储在数据库或文本文件中......就像运行或停止一样。
收到以下异常消息:
Microsoft.Web.Administration.dll 中出现“System.UnauthorizedAccessException”类型的异常,但未在用户代码中处理其他信息:访问被拒绝。 (来自 HRESULT 的异常:0x80070005 (E_ACCESSDENIED))
下面是我试过的代码:
static void Main(string[] args)
{
const double interval60Minutes = 5 * 5 * 1000; // milliseconds to one hour
Timer checkForTime = new Timer(interval60Minutes);
checkForTime.Elapsed += new ElapsedEventHandler(checkForTime_Elapsed);
checkForTime.Enabled = true;
Console.WriteLine("Waiting..");
Console.ReadLine();
}
public static void checkForTime_Elapsed(object sender, ElapsedEventArgs e)
{
GetApplicationPoolNames();
}
public static string GetApplicationPoolNames()
{
ServerManager manager = new ServerManager();
string status;
//string DefaultSiteName = System.Web.Hosting.HostingEnvironment.ApplicationHost.GetSiteName();
//Site defaultSite = manager.Sites[DefaultSiteName];
string appVirtaulPath = HttpRuntime.AppDomainAppVirtualPath;
string mname = System.Environment.MachineName;
string appPoolName = string.Empty;
manager = ServerManager.OpenRemote(mname);
ObjectState result = ObjectState.Unknown;
ApplicationPoolCollection applicationPoolCollection = manager.ApplicationPools;
foreach (ApplicationPool applicationPool in applicationPoolCollection)
{
//result = manager.ApplicationPools[appPoolName].State;
result = applicationPool.State; *// here exception occures*
Console.WriteLine("State : " + result);
Console.ReadLine();
}
}
代码有什么问题?如果有任何其他方法可以实现这一点,请提供,因为这也将帮助我了解异常消息的主要原因。
感谢任何帮助。
谢谢。
【问题讨论】:
-
您阅读异常信息了吗?这是一个权限错误,“访问被拒绝”。确保运行应用程序的用户帐户具有访问您尝试访问的任何内容所需的所有权限。
-
@PranavPatel:检查并实施,但没有运气。还有其他方法可以实现吗?
-
您是如何在 installer.cs 文件中设置 ServiceProcessInstaller.Account 的?是 ServiceAccount.LocalSystem 吗?如果没有,请尝试更改它并重新安装您的 Windows 服务。
-
blog.lextudio.com/2015/05/… 您可以从这篇文章中找到一些事实。如果您的情况,我认为服务帐户必须设置为本地系统。
标签: c# iis windows-services application-pool