コード例 #1
0
        public static Boolean AssignRights(UserSession Session, String CardID)
        {
            logger.Info("cardId='{0}'", CardID);
            using (new Impersonator(ServerExtension.Domain, ServerExtension.User, ServerExtension.SecurePassword))
            {
                Guid CardId = new Guid(CardID);
                switch (Session.CardManager.GetCardState(CardId))
                {
                case ObjectState.Existing:
                    CardData Card = Session.CardManager.GetCardData(CardId);

                    List <TargetObject> TObjects = AssignHelper.LoadMatrix(Settings.MatrixPath, Settings.CardSheetName, Settings.Domain);
                    Card.UnlockCard();
                    logger.Debug("Card unlocked.'");
                    ExtraCard Extra = Card.GetExtraCard();
                    if (Extra.IsNull())
                    {
                        Extra = new ExtraCard(Card);
                    }
                    logger.Debug("ExtraCard received.'");

                    if (!Extra.IsNull())
                    {
                        String CategoryName = Extra.CategoryName;
                        logger.Info("Категория = '{0}'", CategoryName);

                        if (!String.IsNullOrEmpty(CategoryName))
                        {
                            TargetObject TObject = TObjects.FirstOrDefault(to => to.Name == CategoryName);
                            if (!TObject.IsNull())
                            {
                                CardDataSecurity Rights = Card.GetAccessControl();
                                Rights.SetOwner(new NTAccount(Settings.Domain, "DV Admins"));
                                Rights = Rights.RemoveExplicitRights();


                                foreach (AssignGroup Group in TObject.Groups)
                                {
                                    try { Rights.SetAssignGroup(TObject, Group); }
                                    catch (Exception ex) { logger.ErrorException(String.Format("Группа '{0}'", Group.Name), ex); }
                                }

                                AssignGroup[] FolderGroups = TObject.Groups.Where(g => g.DirectoryRights != 0).ToArray();
                                if (FolderGroups.Length > 0)
                                {
                                    String FolderPath = Extra.Path;
                                    if (!String.IsNullOrEmpty(FolderPath))
                                    {
                                        DirectoryInfo Folder = new DirectoryInfo(FolderPath);
                                        if (Folder.Exists)
                                        {
                                            foreach (AssignGroup Group in FolderGroups)
                                            {
                                                try { Folder.SetAssignGroup(TObject, Group); }
                                                catch (Exception ex) { logger.ErrorException(String.Format("Группа '{0}'", Group.Name), ex); }
                                            }
                                        }

                                        else
                                        {
                                            logger.Warn(String.Format("Карточка '{0}' ссылается на несуществующую папку'{1}'", Card.Id, Folder.FullName));
                                        }
                                    }
                                }

                                Card.SetAccessControl(Rights);
                                logger.Info("Права назначены!");
                                return(true);
                            }
                            logger.Warn("Категория '{0}' не найдена в матрице.", CategoryName);
                        }
                    }

                    logger.Info("Права не назначены.");
                    return(false);

                default:
                    return(false);
                }
            }
        }
コード例 #2
0
        public static Boolean Synchronize(UserSession Session, String CardID)
        {
            logger.Info("cardId='{0}'", CardID);
            using (new Impersonator(ServerExtension.Domain, ServerExtension.User, ServerExtension.SecurePassword))
            {
                Guid CardId = new Guid(CardID);
                switch (Session.CardManager.GetCardState(CardId))
                {
                case ObjectState.Existing:
                    CardData Card = Session.CardManager.GetCardData(CardId);

                    Card.UnlockCard();

                    ExtraCard Extra = Card.GetExtraCard();
                    if (Extra.IsNull())
                    {
                        logger.Info("Синхронизация не производилась, неверный тип карточки.");
                        return(false);
                    }

                    if (String.IsNullOrEmpty(Extra.Name) || String.IsNullOrEmpty(Extra.ShortCategory) || (String.IsNullOrEmpty(Extra.Code) && !(Extra is ExtraCardMarketingFiles)))
                    {
                        logger.Info("Синхронизация не производилась, не заполнены обязательные поля.");
                        return(false);
                    }


                    String  Digest    = Extra.ToString();
                    Boolean FileSynch = false;

                    /*Синхронизация с реестром только для КД и ТД*/
                    if (Extra is ExtraCardCD || Extra is ExtraCardTD)
                    {
                        Guid RegItemId = Extra.RegID ?? Guid.Empty;
                        if (RegItemId != Guid.Empty)
                        {
                            try
                            {
                                RowData RegItem = Session.CardManager.GetDictionaryData(RefUniversal.ID).Sections[RefUniversal.Item.ID].GetRow(RegItemId);
                                if (RegItem.GetString(RefUniversal.Item.Name) != Digest)
                                {
                                    logger.Info("Требуется синхронизация...");
                                    RegItem.SetString(RefUniversal.Item.Name, Digest);
                                    foreach (RowData rowData in RegItem.ChildSections[0].Rows)
                                    {
                                        String PropertyName = rowData.GetString(RefUniversal.TypeProperties.Name);
                                        if ((PropertyName == "Код СКБ" && Extra is ExtraCardCD) || (PropertyName == "Обозначение документа" && Extra is ExtraCardTD))
                                        {
                                            rowData.SetString(RefUniversal.TypeProperties.Value, Extra.CodeId);
                                            rowData.SetString(RefUniversal.TypeProperties.DisplayValue, Extra.Code);
                                        }
                                        else if (PropertyName == "Тип документа")
                                        {
                                            rowData.SetString(RefUniversal.TypeProperties.Value, Extra.Category);
                                            rowData.SetString(RefUniversal.TypeProperties.DisplayValue, Extra.Category);
                                        }
                                        else if (PropertyName == "Версия")
                                        {
                                            rowData.SetString(RefUniversal.TypeProperties.Value, Extra.Version);
                                            rowData.SetString(RefUniversal.TypeProperties.DisplayValue, Extra.Version);
                                        }
                                    }
                                    logger.Info("Синхронизация с реестром выполнена.");
                                    FileSynch = true;
                                }
                                else
                                {
                                    logger.Info("Синхронизация не требуется.");
                                }
                            }
                            catch (Exception Ex) { logger.WarnException("Не удалось синхронизировать с записью реестра: " + RegItemId, Ex); }
                        }
                        else
                        {
                            logger.Info("Регистрация в реестре");
                            RowData RegisterRow = Session.CardManager.GetDictionaryData(RefUniversal.ID).GetItemTypeRow(MyHelper.RefItem_TechDocRegister);

                            SubSectionData RegisterTypeProperties = RegisterRow.ChildSections[RefUniversal.TypeProperties.ID];

                            RowData RegistrarUnit = Card.Sections[CardOrd.Properties.ID].GetProperty("Подразделение регистратора");
                            RowData Device        = Card.Sections[CardOrd.Properties.ID].GetProperty("Прибор");

                            RowData RegItem = RegisterRow.ChildSections[RefUniversal.Item.ID].Rows.AddNew();
                            RegItem.SetString(RefUniversal.Item.Name, Card.Description);
                            RegItem.SetString(RefUniversal.Item.Comments, Extra.Number);

                            RowDataCollection PropertiesSubSectionRows = RegItem.ChildSections[RefUniversal.Properties.ID].Rows;
                            RowData           ItemPropertyRow          = PropertiesSubSectionRows.AddNew();
                            ItemPropertyRow.SetGuid(RefUniversal.Properties.Property, RegisterTypeProperties.FindRow("@Name='" + (Extra is ExtraCardCD ? "Код СКБ" : "Обозначение документа") + "'").Id);
                            ItemPropertyRow.SetString(RefUniversal.Properties.DisplayValue, Extra.Code);
                            ItemPropertyRow.SetValue(RefUniversal.Properties.Value, Extra.CodeId, FieldType.Variant);
                            ItemPropertyRow = PropertiesSubSectionRows.AddNew();
                            ItemPropertyRow.SetGuid(RefUniversal.Properties.Property, RegisterTypeProperties.FindRow("@Name='Тип документа'").Id);
                            ItemPropertyRow.SetString(RefUniversal.Properties.DisplayValue, Extra.Category);
                            ItemPropertyRow.SetValue(RefUniversal.Properties.Value, Extra.Category, FieldType.Variant);
                            ItemPropertyRow = PropertiesSubSectionRows.AddNew();
                            ItemPropertyRow.SetGuid(RefUniversal.Properties.Property, RegisterTypeProperties.FindRow("@Name='Версия'").Id);
                            ItemPropertyRow.SetString(RefUniversal.Properties.DisplayValue, Extra.Version);
                            ItemPropertyRow.SetValue(RefUniversal.Properties.Value, Extra.Version, FieldType.Variant);
                            ItemPropertyRow = PropertiesSubSectionRows.AddNew();
                            ItemPropertyRow.SetGuid(RefUniversal.Properties.Property, RegisterTypeProperties.FindRow("@Name='Статус'").Id);
                            ItemPropertyRow.SetString(RefUniversal.Properties.DisplayValue, ((DocumentState)Extra.Status).GetDescription());
                            ItemPropertyRow.SetValue(RefUniversal.Properties.Value, (Int32)(DocumentState)Extra.Status, FieldType.Variant);
                            ItemPropertyRow = PropertiesSubSectionRows.AddNew();
                            ItemPropertyRow.SetGuid(RefUniversal.Properties.Property, RegisterTypeProperties.FindRow("@Name='Подразделение регистратора'").Id);
                            ItemPropertyRow.SetString(RefUniversal.Properties.DisplayValue, RegistrarUnit.GetString(CardOrd.Properties.DisplayValue));
                            ItemPropertyRow.SetValue(RefUniversal.Properties.Value, RegistrarUnit.GetString(CardOrd.Properties.Value), FieldType.Variant);
                            ItemPropertyRow = PropertiesSubSectionRows.AddNew();
                            ItemPropertyRow.SetGuid(RefUniversal.Properties.Property, RegisterTypeProperties.FindRow("@Name='Прибор'").Id);
                            ItemPropertyRow.SetString(RefUniversal.Properties.DisplayValue, Device.GetString(CardOrd.Properties.DisplayValue));
                            ItemPropertyRow.SetValue(RefUniversal.Properties.Value, Device.ChildSections[CardOrd.SelectedValues.ID].FirstRow.GetString(CardOrd.SelectedValues.SelectedValue), FieldType.Variant);
                            ItemPropertyRow = PropertiesSubSectionRows.AddNew();
                            ItemPropertyRow.SetGuid(RefUniversal.Properties.Property, RegisterTypeProperties.FindRow("@Name='Ссылка на карточку документа'").Id);
                            ItemPropertyRow.SetString(RefUniversal.Properties.DisplayValue, Extra.Card.Description);
                            ItemPropertyRow.SetValue(RefUniversal.Properties.Value, Extra.Card.Id, FieldType.Variant);
                            ItemPropertyRow = PropertiesSubSectionRows.AddNew();
                            ItemPropertyRow.SetGuid(RefUniversal.Properties.Property, RegisterTypeProperties.FindRow("@Name='Файлы документа'").Id);
                            ItemPropertyRow.SetString(RefUniversal.Properties.DisplayValue, Extra.Path);
                            ItemPropertyRow.SetValue(RefUniversal.Properties.Value, Extra.Card.Id, FieldType.Variant);

                            Extra.RegID = RegItem.Id;
                            logger.Info("В реестр добавлена запись: " + Card.Description);
                        }
                    }
                    else
                    {
                        FileSynch = true;
                    }

                    if (FileSynch)
                    {
                        logger.Info("Синхронизация пути...");
                        String OldPath = Extra.Path;
                        logger.Info("Старый путь: " + OldPath);
                        String NewPath = String.Empty;
                        logger.Info("Новый путь: " + NewPath);
                        if (Directory.Exists(OldPath))
                        {
                            DirectoryInfo OldFolder    = new DirectoryInfo(OldPath);
                            DirectoryInfo ParentFolder = OldFolder.Parent;
                            if (ParentFolder != null)
                            {
                                logger.Info("Старый путь:" + OldPath);
                                NewPath = MyHelper.RemoveInvalidFileNameChars(Digest);
                                if (NewPath != Digest)
                                {
                                    logger.Info("Удалены недопустимые символы: " + Digest);
                                }
                                NewPath = Path.Combine(ParentFolder.FullName, NewPath);
                                String TempPath = Path.Combine(ParentFolder.FullName, Path.GetRandomFileName());
                                logger.Info("Временный путь:" + TempPath);
                                logger.Info("Новый путь:" + NewPath + @"\");
                                try
                                {
                                    logger.Info("Перемещение во временную папку");
                                    Directory.Move(OldPath, TempPath);
                                    try
                                    {
                                        logger.Info("Перемещение в новую папку");
                                        Directory.Move(TempPath, NewPath);
                                    }
                                    catch (Exception Ex)
                                    {
                                        logger.WarnException("Перемещение не удалось!", Ex);
                                        try
                                        {
                                            logger.Info("Перемещение в старую папку");
                                            Directory.Move(TempPath, OldPath);
                                        }
                                        catch (Exception SubEx)
                                        {
                                            logger.Warn("Перемещение не удалось!");
                                            logger.ErrorException("Перемещение не удалось!", SubEx);
                                            NewPath = String.Empty;
                                        }
                                    }
                                }
                                catch (Exception Ex)
                                {
                                    logger.WarnException("Перемещение не удалось!", Ex);
                                    NewPath = String.Empty;
                                }

                                if (!String.IsNullOrWhiteSpace(NewPath))
                                {
                                    if (!(Extra is ExtraCardMarketingFiles))
                                    {
                                        Extra.Path = NewPath + @"\";
                                    }
                                    logger.Info("Синхронизация пути выполнена");
                                }
                                else
                                {
                                    logger.Warn("Синхронизация пути не выполнена");
                                }
                            }
                            else
                            {
                                logger.Warn("Отсутствует родительская папка!");
                            }
                        }
                        else
                        {
                            logger.Info("Отсутствует путь для синхронизации!");
                        }
                    }
                    return(true);

                default:
                    return(false);
                }
            }
        }