none
Выполняю командлет из VB.NET кода прикреплённого к aspx странице и не получаю результата RRS feed

  • Вопрос

  • За образец взял вот это:
    http://groups.google.com/group/microsoft.public.windows.powershell/browse_thread/thread/42d3a6addd93f4b8

    Выполняют командлет "Get-Mailboxdatabase" из кода VB.NET. результат должен заполнить DropDownList  выходом командлета.
    Если делаю приложение windows forms - всё отлично работает: список заполняется. Когда запускаю в веб приложении в дебажном вэб сервере вижуал студии - тоже отлично работает. Как только публикую или кладу на вэбсервер (IIS 6)  - работать перестаёт: без экспешнов страница грузится, а список который должен из выхода сформироваться пустой.
    Помогите найти подход как с этим разобраться, пожалуйста. :(
    3 июля 2009 г. 14:12

Ответы

Все ответы

  • Возможно, проблема в правильной аутентификации и правах доступа. Если веб-сервер настроен для анонимной аутентификации, то учетная запись, используемая при анонимной аутентификации, может не иметь достаточных разрешений для выполнения требуемых действий. Если настроена Integrated Windows authentication, то здесь встает вопрос делегирования, если службы IIS, AD и Exchange Server расположены на больше чем одном компьютере. Потребуется включить Computer Delegation в свойствах компьютерной учетной записи сервера IIS. Возможно, потребуется более тонкая настройка служб, для которых разрешено делегирование. Подробнее по делегированию см.

    http://www.osp.ru/text/print/302/5052755.html 
    3 июля 2009 г. 19:23
    Модератор
  • У меня имперсонэйшн настроен. Приложение выполняется от имени доменного администратора. Код по созданию пользователя с помощью directoryservices с этого же приложения выполняется с правильными результатами. По идее пауэршел командлеты должны выполняться от того же пользователя?

  •  И ещё: на том же веб сервере, на котором из кода коммандлет не выдаёт результатов, из консоли - выдаёт.

  • Код:


    Imports System.Management.Automation.Runspaces
    Imports System.Management.Automation

    Partial Public Class _Default
        Inherits System.Web.UI.Page

        Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            fill_StorageGroupDDL()
        End Sub

        Sub fill_StorageGroupDDL()
            Dim MyRunSpace As Runspace
            Dim RsConfig As RunspaceConfiguration
            Dim info As PSSnapInInfo
            Dim PSCommand As String
            Dim snapInException As PSSnapInException

            RsConfig = RunspaceConfiguration.Create()
            info = RsConfig.AddPSSnapIn("Microsoft.Exchange.Management.PowerShell.Admin", snapInException)
            MyRunSpace = RunspaceFactory.CreateRunspace(RsConfig)
            MyRunSpace.Open()
            '
            Dim Pipeline As Pipeline
            Pipeline = MyRunSpace.CreatePipeline()

            PSCommand = "Get-Mailboxdatabase"
            Dim myCommand As New Command(PSCommand)

            Dim commandResults
            Pipeline.Commands.Add(myCommand)
            commandResults = Pipeline.Invoke()

            For Each tt In commandResults
                If DirectCast(tt.Properties("Server").Value.ToString, String) = "GRUB" Then
                    StorageGroupDDL.Items.Add(DirectCast(tt.Properties("Name").Value, String))
                End If

            Next
        End Sub

    End Class


    Попробуйте, плиз. В дебаге отлично работает, на iis - болт.

  • А если вы запустите Internet Explorer прямо с консоли веб-сервера, то будет работать ваша процедура?

    Попробую дальше поискать ответ, но все же продублируйте ваш вопрос на форумах разработчиков gotdotnet.ru в разделе ASP.Net
    Модератор
  • Неа. С консоли не работает. Т.е. результата правильного нет.
    Спасибо! Попробую и там.

  • вот такую статью нашёл:
    http://blogs.msdn.com/webdav_101/archive/2008/09/25/howto-calling-exchange-powershell-from-an-impersonated-thead.aspx

    У меня на оснастке уже стоит 8 роллап
    Попробовал добавить в командлет параметр DomainController, так и не заработало. Правда, сейчас пробовал на iis 7.5.
    Больше ничего дельного в статье не разглядел. :(

    7 июля 2009 г. 14:29
  • Временно перепишите процедуру так, чтобы команда Get-Mailboxdatabase отправляла вывод в файл на локальном диске сервера IIS. При этом выводите те только поток StdOut, но и StdErr, чтобы отследить ошибки, которые могут выводиться при выполнении командлета. А по владельцу файла вы сможете определить, под каким пользователем он создается, т.е. работает ли имперсонализация. Пока других идей нет. :(

    И еще на всякий случай спрошу: в свойствах IIS - Web Service Extensions установлено ASP.Net v2.0 - Allowed?
    Модератор
  • ASP включен.
    Похоже всётаки дело с особенностями имперсонэйшна пауэршела. Гугл вывалил кучу всякого по словам "powershell impersonation". Завести пока что не удалось. Ещё заметил что консольное приложение с коммандлетом в коде, оказывается, тоже вываливалось с ошибкой при запуске из тасксчедуллера. А руками когда запускаешь - всё нормально. Намудрили жестоко.

    Была библиотека CDOEXM где всё было просто и понятно, и не было такой фигни. А теперь вот нате. Незачёт Майкрософту за этот пауэршел в качестве единственного средства работы с Exchange 2007. :( Как скриптовой язык может и здорово, а вот для программирования - шайса. :(

    14 июля 2009 г. 8:13
  • На русском форуме по асп молчат. :(
    Для вывода потоков в сам командлет добавить параметры?
    Подскажите как сделать.
    14 июля 2009 г. 8:14
  • поменял командлет на "Enable-Mailbox"
    теперь получаю на iis: Microsoft.Exchange.Configuration.Tasks.ManagementObjectNotFoundException: Database "GRUB\Zhukova" was not found.
    В отладке работает.
    14 июля 2009 г. 14:11
    • Помечено в качестве ответа Vasily GusevModerator 14 августа 2009 г. 8:05
    15 июля 2009 г. 10:51
  • Иными словами, в качестве решения предлагается полный отказ от какой-либо имперсонализации. Может быть, написать код, выполняющий требуемые действия, полностью на VB.Net? У меня небольшой опыт разработки на ASP.Net, но в моих случаях имперсонализация очень хорошо работала, правда, не с Exchange, а с SQL Server.
    15 июля 2009 г. 12:00
    Модератор
  • Ну так раньше была библиотека CDOEXM, а с 2007 Эксча они же поддержку её свернули. Я бы рад на вб.нет писать как раньше. Компоненты больше нет. :((

    В моих случаях имперсонализация тоже отлично работала с System.DirectoryServices, скажем. Это какая-то особенность Powershell, и, по-моему, очень неприятная. С выполнением кода с командлетами из Taskscheduller, похоже, те же самые косяки. Пачка творога это "универсальное" решение.
    Нельзя было CDOEXM так резко сворачивать. Авантюра.
    15 июля 2009 г. 13:36
  • Если действительно есть проблемы с запуском командлетов из планировщика, что создайте новую тему по этому вопросу - в такой формулировке, на мой взгляд, тема вызовет больший интерес, соответственно более вероятно, что будет предложено подходящее решение.
    15 июля 2009 г. 13:43
    Модератор
  • Не просто командлетов, а командлетов встроенных в vb.net приложение.
    Т.е. руками запускаешь приложение - отрабатывает, через планировщик запускаешь приложение - завершено с ошибкой в планировщике.
    Ок. Я тогда посмотрю что будет когда в приложении в следущий раз запустится командлет.

    16 июля 2009 г. 11:08
  • С COM+ вариант заработал. Очень качественно в блоге описана вся процедура. Никогда ничего подобного не делал, и осилил. Блогеру большое спасибо.
    Не очень мне этот вариант нравится, но хоть что-то.

    16 июля 2009 г. 13:07
  • Для того чтобы сделать универсальное COM+ приложение (для выполнения через него разных командлетов, с разными параметрами) придётся разбираться с сериализацией.
    При 2003 Exchange делов было на две копейки, а теперь вот возись на пустом месте.

    21 июля 2009 г. 7:34