RSS Подписка на статьи RSS Подписка на комментарии Панель инструментов

Блог профессионалов стал частью сайта технической поддержки DocsVision http://support.docsvision.com. Новые материалы будут появляться уже на этом сайте.

Поиск

Ярлыки

авто генерация кода (1) Администрирование DocsVision (60) Атрибутивный поиск (3) База данных (24) Базы знаний (1) Безопасность (1) Бизнес-процессы (20) Блог (2) Вы увидите это первыми (1) Групповые политики (1) Диаграммы (2) Задания (2) Интеграция (2) Карточки DocsVision (14) Конструктор Решений (11) Маркетинг и продажи (4) Навигатор (3) Новое (3) Новости (32) Опрос (4) Опросы DocsVision (4) Оптимизация (3) Отчеты (2) Ошибки (1) Поддержка (14) Полезные ссылки (1) Представления (4) Производительность (5) Разбор полетов (18) Разработка для Workflow (7) разработка карточек (2) Разработка на платформе DocsVision (41) Разработка решений (43) Расширение платформы (1) Расширенные отчеты (9) Решения на платформе DocsVision (6) Сервисы DocsVision (3) Сканеры (3) Справочник сотрудников (1) Справочник типов (1) Установка (1) Утилиты (13) Шлюз в SharePoint (8) Штрихкод (2) Cкрипты карточек (7) DocsVision внутри (1) DocsVision Live (1) FileStream (1) FireFox (2) Opera (1) Powershell (5) Safari (1) SharePoint2007 (1) SharePoint2010 (2) Silverlight (1) UltraViews (1) Vista (1)

Переводчик

Как вы уже наверное поняли, все скрипты и прочие приложения я пишу на vb.net. Однако, мои коллеги предпочитают C#. Общаться на одном языке, мне помогает крутой переводчик c# - vb.net.

http://www.developerfusion.com/tools/convert/vb-to-csharp/ Читать дальше

Оставить комментарий (всего: 0)

Чтение прав карточки в сценарии бизнес-процесса

Для решения одного инцидента нам было необходимо фиксировать какой набор прав установлен на карточке в определенный момент времени. Конкретно, в определенных местах бизнес-процесса. Был разработан скрипт, который делает это.


Данные пишутся в журнал бизнес-процесса, соответственно попадают они и в журнал Workflow в режиме отладочных сообщений. Информация выводится в следующем виде:

Карточка документа: CardID
SecurityDescriptor:
Дескриптор безопасности
Пользователь: учетная запись и SID
AccessMask: Маска доступа и расшифровка
AceFlags: флаги
InheritanceFlags:флаги наследования
IsInherited: унаследованные ли права
PropagationFlags: распространение наследования

В скрипте есть недоработка. Строка
Dim oAccountName As NTAccount = DirectCast(oAce.SecurityIdentifier.Translate(GetType(NTAccount)), NTAccount)
может вызвать ошибку в случае если учетка удалена и у неё остался только SID, - в этом случае нельзя получить по SID имя записи. Надо обернуть в Try - Catch.
Скрипт сделан для платформы DocsVision 4.3

Сценарий бизнес-процесса на vb.net:


Option Explicit On
Option Strict On

' подключение системных библиотек
Imports System
Imports System.Xml
Imports System.Security.AccessControl
Imports System.Security.Principal
Imports System.Collections
Imports Microsoft.VisualBasic.Constants
Imports Microsoft.VisualBasic.Strings

' подключение библиотек СУБП
Imports DocsVision.Workflow.Objects
Imports DocsVision.Workflow.Runtime
Imports DocsVision.Workflow.Gates
Imports DocsVision.Platform.HelperAPI
Imports DocsVision.Platform.SecurityManager


Namespace DVScriptHost

    Public Class DVScript
        Dim m_oGate As DVGate
        ' получаем сессию
        Dim m_oSession As DocsVision.Platform.ObjectManager.UserSession
        Dim m_oLastBytes As Byte()

        Private Enum DVRights As Integer

            READ = &H1              ' Чтение, специальное
            WRITE = &H2             ' Изменение
            CREATE_CONTENT = &H4    ' Создание дочерних
            DELETE_CONTENT = &H8    ' Удаление дочерних
            COPY = &H10             ' Копирование

            ' Standard rights
            DELETE = &H10000        ' Удаление
            READ_CONTROL = &H20000  ' Чтение, стандартное
            WRITE_DAC = &H40000     ' Изменение разрешений
            WRITE_OWNER = &H80000   ' Смена владельца
            SYNCHRONIZE = &H100000  ' Не используется

            ACCESS_SYSTEM_SECURITY = &H1000000  ' Изменение параметров безопасности

            ' Generic rights
            GENERIC_ALL = &H10000000        ' Полный доступ
            GENERIC_EXECUTE = &H20000000    ' Выполнение
            GENERIC_WRITE = &H40000000      ' Изменение
            GENERIC_READ = &H80000000       ' Чтение

        End Enum
        Public Sub Execute(ByVal process As ProcessInfo, ByVal passInfo As PassState)

            Try
                ' получаем шлюз
                m_oGate = CType(process.Gates(DVGate.GateID), DVGate)
                ' получаем сессию
                m_oSession = m_oGate.Session

                Dim varDocCard As ProcessVariable
                varDocCard = process.GetVariableByName("Карточка")


                Dim oCard As DVCard = CType(varDocCard.Value, DVCard)

                Dim oAccounts As New ArrayList

                Dim oSecurityDesc As CommonSecurityDescriptor = GetCardDescriptor(process, oCard.ID)

                oAccounts = GetAccountsFromDescriptor(oSecurityDesc)

                process.LogMessage(GetLogMessage(oCard.ID, oAccounts))


            Catch Err As Exception

                ' запись в журнал ошибки исполнения
                process.LogMessage("Ошибка выполнения скрипта:" + Err.Message)

            End Try

        End Sub

        Private Function GetCardDescriptor(ByRef process As ProcessInfo, ByVal CardID As String) As CommonSecurityDescriptor
            Dim oSecureCard As DocsVision.Platform.SecurityManager.ISecureObject = m_oSession.AccessManager.GetSecureCard(CardID)
            Dim oDescBytes As Byte() = DirectCast(oSecureCard.GetSecurity(SecurityInformationEnum.siDacl), Byte())

            ' Получаем объект типа CommonSecurityDescriptor из массива byte() для карточки 
            Dim oSecurityDesc As CommonSecurityDescriptor = New CommonSecurityDescriptor(True, False, oDescBytes, 0)

            m_oLastBytes = oDescBytes
            Return oSecurityDesc

        End Function

        Private Function GetAccountsFromDescriptor(ByVal oSecurityDesc As CommonSecurityDescriptor) As ArrayList
            Dim oAccounts As New ArrayList

            Dim oACL As DiscretionaryAcl = oSecurityDesc.DiscretionaryAcl
            For Each oACE As CommonAce In oACL
                oAccounts.Add(oACE)
            Next
            Return oAccounts
        End Function

        Private Function GetLogMessage(ByVal CardID As String, ByVal oAccounts As ArrayList) As String
            Dim sResult As String = "Карточка документа:" + CardID + vbCrLf
            sResult += "SecurityDescriptor: " + Convert.ToBase64String(m_oLastBytes) + vbCrLf
            For Each oAce As CommonAce In oAccounts
                Dim oAccountName As NTAccount = DirectCast(oAce.SecurityIdentifier.Translate(GetType(NTAccount)), NTAccount)
                sResult += "Пользователь: " + oAccountName.Value.ToString + " (" + oAce.SecurityIdentifier.ToString + ")" + vbCrLf
                sResult += vbTab + "AccessMask:" + vbTab + oAce.AccessMask.ToString + "(" + Decompose(oAce.AccessMask) + ")" + vbCrLf
                sResult += vbTab + "AceFlags:" + vbTab + oAce.AceFlags.ToString + vbCrLf
                sResult += vbTab + "InheritanceFlags:" + vbTab + oAce.InheritanceFlags.ToString + vbCrLf
                sResult += vbTab + "IsInherited:" + vbTab + oAce.IsInherited.ToString + vbCrLf
                sResult += vbTab + "PropagationFlags:" + vbTab + oAce.PropagationFlags.ToString + vbCrLf
            Next

            Return sResult
        End Function

        Private Function Decompose(ByVal iAccessMask As Integer) As String
            Dim sResult As String = vbNullString


            If (iAccessMask And DVRights.ACCESS_SYSTEM_SECURITY) <> 0 Then
                sResult += "+ACCESS_SYSTEM_SECURITY"
            End If



            If (iAccessMask And DVRights.COPY) <> 0 Then
                sResult += "+COPY"
            End If



            If (iAccessMask And DVRights.CREATE_CONTENT) <> 0 Then
                sResult += "+CREATE_CONTENT"
            End If

            If (iAccessMask And DVRights.DELETE) <> 0 Then
                sResult += "+DELETE"
            End If

            If (iAccessMask And DVRights.DELETE_CONTENT) <> 0 Then
                sResult += "+DELETE_CONTENT"
            End If

            If (iAccessMask And DVRights.GENERIC_ALL) <> 0 Then
                sResult += "+GENERIC_ALL"
            End If

            If (iAccessMask And DVRights.GENERIC_EXECUTE) <> 0 Then
                sResult += "+GENERIC_EXECUTE"
            End If

            If (iAccessMask And DVRights.GENERIC_READ) <> 0 Then
                sResult += "+GENERIC_READ"
            End If

            If (iAccessMask And DVRights.GENERIC_WRITE) <> 0 Then
                sResult += "+GENERIC_WRITE"
            End If

            If (iAccessMask And DVRights.READ) <> 0 Then
                sResult += "+READ"
            End If

            If (iAccessMask And DVRights.READ_CONTROL) <> 0 Then
                sResult += "+READ_CONTROL"
            End If

            If (iAccessMask And DVRights.SYNCHRONIZE) <> 0 Then
                sResult += "+SYNCHRONIZE"
            End If

            If (iAccessMask And DVRights.WRITE) <> 0 Then
                sResult += "+WRITE"
            End If

            If (iAccessMask And DVRights.WRITE_DAC) <> 0 Then
                sResult += "+WRITE_DAC"
            End If

            If (iAccessMask And DVRights.WRITE_OWNER) <> 0 Then
                sResult += "+WRITE_OWNER"
            End If

            If sResult <> vbNullString Then sResult = Right(sResult, Len(sResult) - 1)
            Return sResult
        End Function
    End Class

End Namespace


UPD. Убрал лишнее
Читать дальше

Оставить комментарий (всего: 2)

Сообщение об SQL ошибке при работе с данными

В техническую поддержку DocsVision приходят обращения
"Делал операцию ... в Навигаторе. Появилось сообщение об ошибке 'Произошла SQL ошибка при выполнении операции с данными на сервере'"

Данное сообщение означает, что сервер DocsVision выполнял какой либо запрос (процедуру и т.п) на базе данных, и сервер MS SQL вернул сообщение об ошибке. Подробный текст сообщения всегда содержится в журнале сервера DocsVision. Журнал включается в консоли настройки, ветка "Сервер", поле "Файл журнала".



Как правило, по тексту сообщения можно понять, в чем причина. Если же нет, то текст сообщения об ошибке, с описанием действия, это те данные, которые необходимо присылать в таких случаях в техподдержку.

p.s. Сообщения в журнале сервера могут появляться с некоторой задержкой. Читать дальше

Оставить комментарий (всего: 0)

Присоединение по штрих-коду

Иногда встречается такая ситуация, когда присоединение по штрих-коду происходит ни к той картчке, но если посмотреть в xml карточке или через DVExplorer, то номера штрих-кодов будут одинаковы в нескольких карточках.
При такой ситуации нужно:
Проверить, что на справочник настроек у всех сотрудников есть право чтения (в т.ч. право чтения на подчиненные объекты) + первый сотрудник, который выдает штрих-код должен иметь право на запись, что бы туда прописался ID нумератора. Также в системе не должно быть каких-либо пользовательских скриптов для работы с нумераторами.

Проверить, что все нормально можно так:
1. выдаем штрих-код под администратором, смотрим на XML справочника настроек, ищем там поле BarcodeNumerator, запоминаем ID
2. выдаем штрих-код под обычным сотрудником, снова смотрим XML и ищем поле BarcodeNumerator - ID должен быть тем же самым. Если ID стал другой и при этом не было никаких ошибок, то, значит, неверно настроены права. Читать дальше

Оставить комментарий (всего: 0)

Опрос об очередности выпуска дополнительных модулей DocsVision

Дорогие друзья!
В нашем блоге появился новый опрос об очередности выпуска дополнительных модулей DocsVision. Количество дополнительных модулей сегодня уже достигло 17 и будет увеличиваться. На их выпуск после выхода очередного релиза платформы DocsVision уходит достаточно много времени. Мы делаем все возможное чтобы сократить это время без ущерба для качества продуктов, однако выпуская в первую очередь модули, наиболее востребованные в проектах внедрения, мы существенно сократим сроки готовности всей системы.
Просим вас потратить несколько минут и ответить на опросную анкету, расставив модули по очередям выпуска в оптимальном на ваш взгляд порядке.
Заполнить опрос можно по данной ссылке http://surveys.polldaddy.com/s/D7E31B7973CC4C94/. Так же ссылка на опрос будет висеть в правом верхнем модуле блога.
Заранее благодарны за сотрудничество. Читать дальше

Оставить комментарий (всего: 0)

Новая система поддержки пользователей HelpDesk2. Общее описание.

В службе технической поддержки DocsVision мы используем собственную систему HelpDesk поддержки пользователей на основе DocsVision (текущая версия 4.3.1848). Эта система является частью общего инструмента производства платформы DVManagement.

Как это работает? Состав таков.

1. Основным объектом является карточка "Обращения", которая хранит всю информацию об инциденте: контакты, описание, история переписки с файлами и т.п.



2. Так же используется ряд справочников для хранения информации: справочник контрагентов - контакты, универсальный справочник - версии DocsVision, справочник модулей DocsVision (разработан дополнительно) - список модулей.

3. Набор бизнес-процессов
  - бизнес-процессы отвечающие за обработку входящей почты
  - процессы, которые отправляют ответы, и напоминания
  - обслуживающие процессы, которые удаляют спам, отправляют внутренние напоминания и т.п.

4. Отчеты на базе модуля "Расширенные отчеты"


Данная система хорошо работает, однако её минусы не дают нам сделать коммуникации еще более качественными. Какие же минусы?

1. Используется древний и неудобный канал коммуникации - электронная почта. Письма могут банально не доходить.
2. Всю историю переписки, текущий статус инцидента видят только инженеры технической поддержки, но не специалисты, которые обращаются к нам, то есть вы. У вас остается только набор ответов в виде писем, что не удобно.
3. Вам недоступен поиск по инцидентам.
4. В текущей реализации поддерживается только один уровень обслуживания (SLA). Масштабирование невозможно.
5. В качестве идентификатора пользователя является его адрес электронной почты.

Итак задача модернизации возникла. Как её решить? Прежде всего было просмотрено довольно много уже готовых продуктов. HP Service Desk - круто, но слишком много функционала, дорогой продукт и внедрение. Zendesk - очень удобный интерфейс, красиво сделано, модель SaaS, но функционал не подходит для нашей модели поддержки. OmniTracker - подходит, интерфейс, кстати на DocsVision похож. DocsVision ServiceDesk - подходит, но требует доработки некоторых модулей под наши задачи.  И еще большая куча продуктов, как коммерческих так и бесплатных.
В общем два подхода: использовать сторонний продукт, разрабатывать свой продукт на базе DocsVision.
 Дебаты были не бурными - DocsVision прекрасная платформа для разработки продуктов такого типа. Тем более что DVManagement это прекрасно продемонстрировал. Так же не хотелось делать гетерогенную структуру, в которой в качестве багтрекинга использовался бы DVManagement на DocsVision и сторонний продукт.

Сказано, сделано. Какова планируемая архитектура.

1. 100% веб интерфейс, построенный на легком клиенте и веб-форме карточки.
2. Новые объекты: карточка обращения, карточка SLA
2. ActiveDirectory в качестве службы хранения идентификационных данных.
3. Структура виртуальных папок для отслеживания своих инцидентов, а так же инцидентов созданных другими специалистами своей компании
4. Отчеты, которые позволяют посмотреть сколько инцидентов решено за период, находится в работе и т.п. При открытии Навигатора в личной папке отображается html страница отчета: сколько инцидентов требуют вашего ответа, сколько находятся в решении в службе технической поддержки. Статистика по решенным инцидентам за периоды.
5. Состояние любого инцидента, а так же дату следующего ответа можно посмотреть в карточке. Эта же информация будет выводиться в представление.
Планируем ввести в эксплуатацию в 1м квартале 2010 года. Читать дальше

Оставить комментарий (всего: 1)