Ошибка Server.CreateObject() с 32-разрядной версией Windows и IIS 7

Windows 7 32 бит, IIS 7.5.760016385

Я создал DLL в Visual Basic 6.0 и пытался использовать его из классического ASP-кода:

set obj = Server.CreateObject("a.b")

Я получаю следующую ошибку:

006 ASP 0178
Ошибка доступа к серверу .CreateObject
При вызове Server.CreateObject не удалось выполнить проверку разрешений. Доступ запрещен этому объекту.
err.number = -2147024891

Я попытался создать пользователя iusr_cmpname и предоставить ему права на веб-сайте по умолчанию и в виртуальном каталоге этой страницы ASP. У меня есть REGSVR32'd. Dll.

Я перешел к разделу "Включение и выключение функций Windows" и выбранные функции IIS/World Wide Web Services/Application Development, затем ПРОВЕРЕНА из ASP, ASP.net, ISAPI-расширений и фильтров ISAPI.

Я следил за многими выводами в разных группах новостей, но я могу преодолеть эту проблему. Мы пробовали это в прошлом году, год и 1/2 назад и имели ту же проблему. Поскольку мы не смогли преодолеть эту проблему, мы вернулись к Windows NT. У нас никогда не было этой проблемы на NT.

Теперь мы пытаемся снова пройти мимо этого, чтобы снова перейти на Windows 7. Похоже, что у многих людей была эта проблема, но любое решение, которое они нашли и опубликовали, похоже, не то, что мне нужно.

Любая помощь будет оценена. Спасибо.

Ответ 1

Я настоятельно рекомендую использовать Procmon, чтобы найти нарушение доступа. У меня была аналогичная проблема много лет назад, и это было единственное, что ее разрешило. В этом случае оказалось, что в системной папке temp отсутствуют разрешения.

Если вы публикуете результаты Procmon, я могу изменить этот ответ, чтобы быть более полезным.

Ответ 2

Проблема, похоже, связана с тем, что IIS не имеет доступа к вашей пользовательской VB6 Active X dll в файловой системе. Я зарегистрировал пользовательскую dll, которую я создал, в том же каталоге, что и веб-приложение по умолчанию, и смог получить ASP для создания объекта.

Вот что я сделал:

  • Чистая установка 64-разрядной версии Windows 7 Professional, SP1.

  • Включить функцию Windows ASP

  • Этот шаг ТОЛЬКО для 64-разрядной Windows - с помощью диспетчера IIS включите 32-разрядные приложения для пула приложений по умолчанию.

enable 32-bit application pool

  • Создайте простую VB6 Active X dll (имя класса - "CXUtils.Utils" ), которая добавляет два входных номера и возвращает результат.

Utils.cls:

Public Function Sum(ByVal a As Integer, ByVal b As Integer) As Integer     
    Sum = a + b
End Function
  • Это важный шаг - в командной строке администратора зарегистрируйте DLL Vb6 Active X в местоположении веб-приложения по умолчанию: C:\Inetpub\Wwwroot

Register Custom VB6 DLL

  • Создайте и установите простую страницу asp, которая создает экземпляр dll сверху. Место установки - это местоположение веб-приложения по умолчанию C:\inetpub\wwwroot

Default.asp:

<%@ Language=VBScript %>
<%
Option Explicit
Response.Expires = 0
Response.Expiresabsolute = Now() - 1 
Response.AddHeader "pragma","no-cache" 
Response.AddHeader "cache-control","private" 
Response.CacheControl = "no-cache" 

Function Sum(a, b)
    Sum = a + b
End Function

Function Sum2(a, b)
    Dim adder
    set adder = Server.CreateObject("CXUtils.Utils")
    Sum2 = adder.Sum(a, b)
    set adder = nothing
End Function
%>
<html>
    <head>
        <title>Add</title>
    </head>
    <body>
    <b>2 + 3</b> = <%= Sum(2,3) %><br />
    <b>3 + 4</b> = <%= Sum2(3,4) %>
    </body>
</html>
  • Просмотрите веб-приложение и просмотрите результаты.

Sample asp page results

Мои извинения, если это не все компилируется - было много редактирования, чтобы правильно форматировать.

Ответ 3

Эта страница предполагает, что проблема может быть правами доступа, назначенными для среды выполнения VB. Попробуйте назначить всем пользователям права на чтение и выполнение на Msvbvm60.dll.

http://support.microsoft.com/kb/278013

Ответ 4

Я думаю, что у меня была аналогичная проблема. Я пытался сделать интерактивный код отладки в DLL VB6, который был запущен в VB6 IDE из классического приложения ASP. Когда приложение выполнило оператор Server.CreateObject, оно возвратило следующую ошибку:

Объект сервера: 006 ~ ASP 0178 ~ Server.CreateObject Ошибка доступа ~ Ошибка вызова Server.CreateObject при проверке разрешений. Доступ запрещен этому объекту.

Кстати, я запускаю IIS 7.5 в среде Windows 7. Я наконец нашел статью Microsoft, в которой говорилось, что проблема связана с отсутствием записи реестра для VB ASP Debugging в DCOM и/или неадекватными разрешениями с DCOM, а не с IIS. URL-адрес статьи http://support.microsoft.com/kb/q259725. Я реализовал Work Around # 1. Одна перезагрузка позже, я мог бы вступить в VB DLL-код из ASP. Мел один для Microsoft, и я не так часто говорю: -)

Ответ 5

Другим подходом, который может работать, является установка DLL в качестве приложения DCOM на dcomcnfg. Он будет работать под разными учетными данными.