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); } } }
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); } } }