gpt4 book ai didi

c# - 检查 IIS 应用程序池的状态

转载 作者:太空宇宙 更新时间:2023-11-03 21:11:01 25 4
gpt4 key购买 nike

我正在开发一个 Windows 服务,它将每 5 分钟获取一次 IIS 应用程序池状态信息,并将其存储在数据库或文本文件中……例如正在运行或已停止。

获取以下异常消息:

An exception of type 'System.UnauthorizedAccessException' occurred in Microsoft.Web.Administration.dll but was not handled in user code Additional information: Access is denied. (Exception from 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();
}
}

代码有什么问题?如果有任何其他方法可以实现此目的,请提供,因为这也将帮助我理解异常消息的主要原因。

感谢任何帮助。

谢谢。

最佳答案

提出的问题太旧了,但想分享解决方案,这可能有助于解决在尝试获取/读取服务器的 IIS 应用程序池信息时发生的此类错误/异常。

要在尝试访问 IIS 信息时解决未授权访问异常,首先使用 DirectoryEntry Class 提供服务器凭据像下面-

DirectoryEntries appPools = new DirectoryEntry("IIS://" + ServerName + "/W3SVC/AppPools", UName, Pwd).Children;

这将允许访问相应服务器的 IIS。

所以,修改后完整的GetApplicationPoolNames()方法是——

public static string GetApplicationPoolNames()
{
// Get Server Credentials and Server Name from config file
string UName = ConfigurationManager.AppSettings["User"];
string Pwd = ConfigurationManager.AppSettings["Pass"];
string ServerName = DT.Rows[i]["ServerName"].ToString().Trim(); //Server Names from db
DirectoryEntries appPools = null;
try
{
appPools = new DirectoryEntry("IIS://" + ServerName + "/W3SVC/AppPools", UName, Pwd).Children;
}
catch(Exception ex)
{
log.ErrorFormat("serviceLogic -> InsertStatus() -> IIS Pool App Region -> DirectoryEntries -> Error: ", ex.Message.ToString());
}

log.Info("IIS App Pool Section Started for " + System.Environment.MachineName.ToString());

try
{
foreach (DirectoryEntry appPool in appPools)
{
log.Info("App Pool : " + appPool.Name.ToString());
int intStatus = 0;
string status = "";
try
{
if (appPool.Name.ToString().ToLower().Trim() == DT.Rows[i]["AppPoolSrvName"].ToString().ToLower().Trim())
{
log.Info("Process Started for App Pool : " + appPool.Name.ToString());

intStatus = (int)appPool.InvokeGet("AppPoolState");
switch (intStatus)
{
case 2:
status = "Running";
break;
case 4:
status = "Stopped";
break;
default:
status = "Unknown";
break;
}

//Store status info to db or file Logic goes here..

//Start App pool, If any application pool status is not Running.
if (status != "Running")
appPool.Invoke("Start", null);

log.Info("Process Completed for App Pool : " + appPool.Name.ToString());
}
}
catch (Exception ex)
{
log.ErrorFormat("serviceLogic -> InsertStatus() -> IIS Pool App Region -> Error: ", ex.Message);
}
}
}
catch (Exception ex)
{
log.ErrorFormat("serviceLogic -> InsertStatus() -> IIS Pool App Region -> DirectoryEntries -> Error: ", ex.Message);
}
}

关于c# - 检查 IIS 应用程序池的状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37613513/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com