System.Management доступ запрещен - PullRequest
3 голосов
/ 11 ноября 2010

Я использовал некоторый код, чтобы попытаться подсчитать количество процессоров в .NET 2.0:

internal static int GetNumberOfProcessors()
{
    List<string> list = new List<string>();
    ManagementClass mgmt = new ManagementClass("Win32_Processor");
    foreach (ManagementObject obj in mgmt.GetInstances())
    {
        string item = obj.Properties["SocketDesignation"].Value.ToString();
        if (!list.Contains(item))
        {
            list.Add(item);
        }
    }
    return list.Count;
}

, и он взорвался так:

[ManagementException: Access denied ]
   System.Management.ManagementException.ThrowWithExtendedInfo(ManagementStatus errorCode) +377984
   System.Management.ManagementScope.InitializeGuts(Object o) +654
   System.Management.ManagementScope.Initialize() +162
   System.Management.ManagementObject.Initialize(Boolean getObject) +492
   System.Management.ManagementClass.GetInstances(EnumerationOptions options) +122
   System.Management.ManagementClass.GetInstances() +6

Этот код работает нормальнолокально на cassini, но взрывается на нашем бета-сервере.Кто-нибудь знает, что с этим делать?

Ответы [ 3 ]

10 голосов
/ 30 ноября 2010

Хорошо, я ненавижу отвечать на свой вопрос, но я нашел это: http://support.microsoft.com/kb/317012 и, похоже, он работает.

Вы должны специально изменить разрешения CIMV2, и мне пришлосьэто для конкретного пользователя, а не ASPNET.Как только это будет включено, вы можете использовать код System.Management для подсчета процессоров и т. Д.

Мне действительно не нравится, насколько это было неясно.Microsoft должна обновить эти исключения.Когда класс System.Management не работает таким образом, он должен предоставить подробную информацию о том, какие разрешения необходимо активировать для работы кода.

2 голосов
/ 11 ноября 2010

Похоже, проблема с разрешениями.

Если он работает нормально локально (под cassini), он будет работать под вашими учетными данными, которые, вероятно, имеют права локального администратора, следовательно, права доступа к этим данным.

Убедитесь, что код выполняется от имени пользователя, имеющего достаточные разрешения для получения этих данных (если на IIS 7 и более поздних версиях посмотрите идентификацию пула приложений - это будет учетная запись, выполняющая код).

0 голосов
/ 21 января 2016

Боже, все еще сталкиваюсь с той же проблемой, используя Aspose.Email (проверка адреса электронной почты домена).

Вот мое сообщение об ошибке:

System.Management.ManagementException: доступ запрещенв System.Management.ManagementException.ThrowWithExtendedInfo (ManagementStatus errorCode) в System.Management.ManagementScope.InitializeGuts (Object o) в System.Management.ManagementScope.Initialize () в System.Management.ManagementObjectSearcher.InitialanjectSjectMjectSjectMjectSjectMjectSjectMjectSjectMjectSjectMjectSjectMjectSjectMjectSjectMjectSjectMjectSjectMjectSjectMjectSjectMjectSjectMjectSjectMjectSjectMjectSjectMjectSjectMjectSjectMjectSjectMjectSjectMjectSjectMjectSjectMjectSjectMjectSjectMjectSjectMjectSjectMjectSjectMjectS).Get () at. () At. () At. (String) в Aspose.Email.Verify.EmailValidator. (String, Int32) в Aspose.Email.Verify.EmailValidator. (String, MailAddress, String [] &)

И мое решение для моего приложения ASP.NET - обернуть код в

using (HostingEnvironment.Impersonate()) 
{
    ...
}     
...