г. Санкт-Петербург
Войти
Логин
Пароль
Зарегистрироваться
После регистрации на сайте вам будет доступно отслеживание состояния заказов, личный кабинет и другие новые возможности
Заказать звонок
Логин
Пароль
Зарегистрироваться
После регистрации на сайте вам будет доступно отслеживание состояния заказов, личный кабинет и другие новые возможности
Логин
Пароль
Зарегистрироваться
После регистрации на сайте вам будет доступно отслеживание состояния заказов, личный кабинет и другие новые возможности


1
4
5
6
7
8
9
10
11
12
13
БИТРИКС ОБРАБОТЧИКИ СОБЫТИЙ. OnAfterIBlockElementUpdate
 
БИТРИКС ОБРАБОТЧИКИ СОБЫТИЙ. ONAFTERIBLOCKELEMENTUPDATE.

Для решения задачи обновления свойств элементов в Битрикс иногда может понадобится использовать события Битрикса.

Сейчас мы рассмотрим работу с событием OnAfterIBlockElementUpdate.

Идем по порядку.

Пример использования OnAfterIBlockElementUpdate:[CODE]AddEventHandler("iblock", "OnAfterIBlockElementUpdate", Array("UpdateElement", "Update"));
class UpdateElement
{
//Чтобы у нас не было 504 ошибки необходимо прописать этот код, он не дает зациклится нашему скрипту
public static $disableHandler = false;

function Update(&$arFields)
{
if (self::$disableHandler)
return;

CModule::IncludeModule("iblock");

//Обновляем только элементы из определенного инфоблока
if( $arFields["ID"]> 0 && $arFields["IBLOCK_ID"] == "7")
{

$el = new CIBlockElement;

$arLoadProductArray = Array(
"ACTIVE" => "Y", //делаем элемент активным
);

self::$disableHandler = true; //отключаем
if($res = $el->Update($arFields["ID"], $arLoadProductArray))

{
//Здесь может быть ваш код, echo написанное здесь выводится не будет
echo 'Обновление завершено';
}

}

}
}
?>
[/CODE]

События Битрикса очень мощьный инструмент, который во многих случаях может облегчить жизнь разработчику! На этом все, в следующих статьях обязательно опишу пример с событиями поинтереснее.

О событиях, которые возникают при импорте каталога из 1С в Битрикс
 
О событиях, которые возникают при импорте каталога из 1С в Битрикс

В контексте интеграции 1С Предприятия и Битрикс не утихают споры по поводу того, какие события при этом отрабатывают, а какие не отрабатывают. А спорить, в общем-то, не о чем – благо, Битрикс поставляется нам в исходных кодах.
Класс импорта CIBlockCMLImport, который я так люблю наследовать, описан в файле
\bitrix\modules\iblock\classes\general\cml2
Открыв этот файл, мы ясно видим, что элементы инфоблока товаров, как и элементы инфоблока предложений добавляются функцией CIBlockElement::Add
, а изменяются функцией CIBlockElement::Update

Исходные коды этих функций мы можем посмотреть в файлах (в одном описан класс CAllIBlockElement в другом – его наследник CIBlockElement)
\bitrix\modules\iblock\classes\general\iblockelement.php
\bitrix\modules\iblock\classes\mysql\iblockelement.php

Что же мы видим там?
В функции Add имеется вот такая конструкция – перед самым сбросом управляемого кеша:

$events = GetModuleEvents("iblock", "OnAfterIBlockElementAdd");
while ($arEvent = $events->Fetch())
ExecuteModuleEventEx($arEvent, array(&$arFields));

То есть вызывается и отрабатывает событие OnAfterIBlockElementAdd Причем каждый из описанных обработчиков этого события. Как мы можем видеть, вызов этого события происходит всегда – безусловно, то есть каждый раз при отработке функции CIBlockElement::Add и не важно, вызвана ли она в классе импорта или где-то еще.

Кроме этого в этой же функции вызывается другое событие

if(!isset($arFields["WF_PARENT_ELEMENT_ID"]) && $arIBlock["FIELDS"]["LOG_ELEMENT_ADD"]["IS_REQUIRED"] == "Y")
{
$USER_ID = is_object($USER)? intval($USER->GetID()) : 0;
$db_events = GetModuleEvents("main", "OnBeforeEventLog");
$arEvent = $db_events->Fetch();

}Но не каждый раз, а по условию. Это не что иное, как событие при записи в журнал событий. И оно выполняется, если в настройках инфоблока указано журналировать добавление элемента.

А вот вызова события OnBeforeIBlockElementAdd я в функции Add не нашла (оно там есть, но вызвано не напрямую). Нет его и в классе импорта CIBlockCMLImport

Посмотрим теперь, что у нас имеется в функции CIBlockElement::Update

$events = GetModuleEvents("iblock", "OnAfterIBlockElementUpdate");
while ($arEvent = $events->Fetch())
ExecuteModuleEventEx($arEvent, array(&$arFields));

Вызов события OnAfterIBlockElementUpdate – имеется
Вызова события OnBeforeIBlockElementUpdate – не имеется

Зато вызовы событий OnBeforeIBlockElementUpdate и OnBeforeIBlockElementAdd присутствует в методе класса CAllIBlockElement CheckFields, который в свою очередь вызывается и в Add, и в Update Но функция CheckFields вызывается в них уже по условию.

Из вышесказанного я делаю следующие выводы: безусловно, при импорте каталога из 1С Предприятия в Битрикс отрабатывают обработчики событий OnAfterIBlockElementAdd и OnAfterIBlockElementUpdate, они отрабатывают уже после вставки/обновления элемента и, в принципе, могут быть использованы для модификации данных в инфоблоке, но ценой дополнительных запросов к базе. А дополнительные запросы к базе при импорте – это порой убийство импорта.

События OnBeforeIBlockElementUpdate и OnBeforeIBlockElementAdd так же могут отрабатывать при импорте при определенных условиях, однако уже по тому, каким образом они вставлены в исходный код битрикс, видно, что они задуманы не для модификации данных перед вставкой/обновлением, а для какой-то необычной кастомной проверки, возможно, какого-то поля необычного формата.

Поэтому, как я уже писала в одной из предыдущих статей, мне однозначно не нравится кастомизация импорта посредством использования этих событий – я для этих целей предпочитаю кастомизировать компонент импорта и наследовать класс CIBlockCMLImport, добавив наследнику требуемый функционал. Еще лучшим решением было бы конечно, написание, композитного класса, но это очень трудоемко. (Кстати, как видно из исходных кодов, разработчики Битрикс не гнушаются использовать наследование, значит и нам – сам Бог велел).

О событиях, возникающих при добавлении/обновлении раздела инфоблока, а так же при обновлении/добавлении цены товара я писать здесь не буду – нужно вклиниться в них – открываем исходники и смотрим, где они и как.

О событии
foreach(GetModuleEvents("catalog", "OnSuccessCatalogImport1C", true) as $arEvent)
ExecuteModuleEventEx($arEvent);которое Битриксоиды вставили прямо на последний шаг работы своего стандартного компонента импорта из 1С, наверное, знают все. Но если вы используете его для кастомизации импорта … это плохо.

Единственное, что можно безболезненно повесить на это событие – это, к примеру, отправку письма администратору сайта о том, что импорт успешно завершен или что-то иное в этом роде. Но, к примеру, обходить в обработчике этого события весь многотысячный каталог и что-то там перераспределять – пересчитывать…. я думаю, все уже поняли, каково мое мнение на этот счет, так что я воздержусь от нелитературных выражений.

Я думаю, к интеграции 1С Предприятия и Битрикс нельзя подходить по принципу «если работает, то ничего не нужно менять». Нужно оптимизировать, оптимизировать и еще раз оптимизировать.

статья взята с сайта: [URL=http://bedrosova.blogspot.com/2013/04/1.html]http://bedrosova.blogspot.com/2013/04/1.html[/URL]
Если битрикс требует обязательно авторизации при оформлении заказа, Если при входе в оформление заказа bitrix начинает спрашивать принудительно авторизацию
 
Нужно снять галку

В настройках основного модуля:

[TABLE][TR][TD]Запрашивать подтверждение регистрации по email ([URL=https://s-alpha.ru/bitrix/admin/message_admin.php?lang=ru&set_filter=Y&find_type_id=NEW_USER_CONFIRM]почтовые шаблоны[/URL]):

[/TD][/TR][/TABLE]
Битрикс Если необходимо копировать значение реквизита в свойство например ШтрихКод, Выгрузка в свойство реквизита из 1С для БУС Битрикс
 
Задача:

Необходимо выгружать штрихкод яндекс маркета из 1С на сайт и при выгрузке из 1с если поле это не пустое копировать в свойство штрихкод

Если же все же оно пустое то копировать не надо.

Решается добавлением двух хандлеров на обновление элемента и добавление

и функции OnAfterIBlockEl

//Функция при добавлении или изменении элемента выполняется код функции

[CODE]AddEventHandler("iblock", "OnAfterIBlockElementUpdate", "OnAfterIBlockEl");
AddEventHandler("iblock", "OnAfterIBlockElementAdd", "OnAfterIBlockEl");

function OnAfterIBlockEl(&$arFields) {

if (CModule::IncludeModule("iblock")):
$res = CIBlockElement::GetByID($arFields['ID']);
if($obRes = $res->GetNextElement())
{
$ar_res = $obRes->GetProperty("SHTRIKHKOD_DLYA_MARKETA");

//В вашем случае SHTRIKHKOD_DLYA_MARKETA - нужно заменить на символьный код нужного св-ва

$setProperty = $ar_res['VALUE'];
}

endif;

//проверка, если setProperty не пустая то значение копируется в свойство CML2_BAR_CODE

if(!empty($setProperty)){
CIBlockElement::SetPropertyValuesEx (
$arFields['ID'],$arFields['IBLOCK_ID'],array (
'CML2_BAR_CODE' => $setProperty
)
);
}

}
[/CODE]
//В вашем случае CML2_BAR_CODE - нужно заменить на символьный код нужного св-ва
Замена перевыпущенного сертификата Exchange 2010 в связке с TMG, Замена производится при обновлении сертификата перевыпуске и в связке с эксченджем и тмг
 

1. перевыпуск сертификата производим заранее т.к обычно это занимает не менее 4-6 часов в зависимости от поставщика

В первую очередь потребуется доступ к administrator@ваш_домен т.к обычно именно на эту почту высылают запросы на подтверждение выпуска сертификата и таким образом вы подтверждаете права на домен.

потребуется : подтвердить перевыпуск.
потом подтвердить выпуск


Получив сертификат в виде crt

обычно это файл crt , bundle и закрытый ключ

нам потребуется сертификат PKCS#12

Его легко можно за минуту собрать через сайт:


распакуйте ваш архив с сертификатом в первое поле установите файл crt

во второе .key (закрытый ключ)

[URL=https://www.leaderssl.ru/tools/ssl_converter]https://www.leaderssl.ru/tools/ssl_converter[/URL]

2. Получив pfx (Pks12) файл идем на сервер exchange

mmc - открываем сертификаты - компьютер (см фото)

Импортируем в раздел личные (компьютера) новый сертификат

ВНИМАНИЕ! нужно обязательно ставить галку для экспорта т.к в этом случае в сертификат будет включен закрытый ключ.

3. в exchange идем в раздел Настройка серверов
раздел "сертификаты exchange" видим нужны сертификат (проверяем по дате) настраиваем на него все службы

IMAP, POP, IIS ,SMTP

4. Настройка TMG в mmc - открываем сертификаты - компьютер (см фото)
Импортируем в раздел личные новый сертификат.(так же как в пункте 2) но TMG обычно установлен на другом компьютере и там тоже потребуется его добавить

идем в консоль ТМГ выбираем веб-прослушиватель Exchange(в вашем случае он может  называться иначе) в нем перевыбираем новый сертификат.

Правило можно сразу протестировать, если сертификат вы не видите то скорей всего вы его импортировали без закрытого ключа
Изменено: pilot - 09.03.2021 18:45:48
Настройка времени на контроллере домена 2012 \ 2008 r2
 

проблема остановки сервиса времени

См. в планировщике \Microsoft\Windows\Time Synchronization

сделано по инструкции из КИ

Все необходимое одной строкой

w32tm.exe /config /manualpeerlist:"time.nist.gov,0x8 ntp1.imvp.ru,0x8 ntp2.imvp.ru,0x8 time.windows.com,0x8 pool.ntp.org,0x8" /syncfromflags:manual /reliable:yes /update

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config]"
MaxPosPhaseCorrection"=dword:FFFFFFFF"
MaxNegPhaseCorrection"=dword:FFFFFFFF

Применение внесенных в конфигурацию службы времени измененийw32tm /config /update

Принудительная синхронизация от источника

[CODE]w32tm /resync /rediscover[/CODE]


Отображение состояния синхронизации контроллеров домена в домене

[CODE]w32tm /monitor[/CODE]


Отображение текущих источников синхронизации и их статуса

[CODE]w32tm /query /peers
[/CODE]
Скрипт Online реиндексации всех пользовательских баз 1С, Он лайн
 
Скрипт производит он-лоай

(прямо в рабочее время)

Реидексацию порушенных индексов, можно запускать даже на средне загруженной базе, но в идеале конечно попросить тех кто может покинуть базы 1С

Время выполнения от нескольких минут до полу-часа, в течении которого возможно замедление производительности изза нагрузки на диск SQL сервера
[CODE]-- Параметры скрипта
declare @database_names as nvarchar(max) = N''; -- имена баз задавать через запятую, если не заданы, то все несистемные базы
-- пока парсер примитивный - строка просто делится по запятым и обрезаются крайние пробелы
-- (если в имени базы будет запятая или в начале или конце имени пробел, то система не работает)
-- если указано "-ИмяБазы", то база будет исключена,
declare @index_size_threshhold as int = 1024; -- минимальный размер в КБ для перестраиваемого индекса. Нет смысла перестраивать индексы на десяток страниц
declare @index_rebuild_threshhold as numeric(5,2) = 15; -- показатель фрагментации, начиная с которого происходит перестроение индекса
declare @index_defrag_threshhold as numeric(5,2) = 105; -- показатель фрагментации, начиная с которого происходит дефрагментация индекса
declare @index_rebuild_space_used_threshhold as numeric(5,2) = 50; -- процент заполненности страниц меньше которого требуется перестроение индекса
declare @timeout as int = 3600; -- максимальное время работы скрипта
declare @max_size as bigint = 536870912; -- максимальный суммарный обрабатываемый размер в КБ (чтобы не нагенерировать логов на терабайты) -- 512*1024*1024 КБ = 0,5 ТБ
declare @is_emulate as bit = 0; -- 0 - выполнять, 1 - только вывести команды

set nocount on;
use master;

declare @indexes as table (
database_name nvarchar(128) not null,
schema_name nvarchar(128) not null,
table_name nvarchar(128) not null,
index_name nvarchar(128) not null,
is_clustered bit not null,
size_kb bigint not null,
fragmentation numeric(5,2) not null
);
declare @database_names_table as table (
name nvarchar(128) not null primary key
);
if object_id('tempdb..#index_stats') is not null
drop table #index_stats;
create table #index_stats (
database_id smallint not null,
object_id int not null,
index_id int not null,
index_type_desc nvarchar(60) not null,
avg_fragmentation_in_percent float not null,
page_count bigint not null,
avg_page_space_used_in_percent float not null,
record_count bigint not null,
index_name nvarchar(128),
table_name nvarchar(128),
schema_name nvarchar(128),
db_name nvarchar(128)
)

print '-- ' + convert(nvarchar(max), getdate(), 121) + ' -- Поиск баз данных для обслуживания'
declare @timeout_datetime datetime = dateadd(second, @timeout, getdate());


-- Создание списка обслуживаемых БД по @database_names
with database_name_table(database_names_tail, database_name) as
(
select
substring(@database_names, nullif(charindex(',', @database_names, 1), 0) + 1, len(@database_names) + 1),
rtrim(ltrim(left(@database_names, isnull(nullif(charindex(',', @database_names, 1), 0) - 1, len(@database_names)))))
where
@database_names is not null
union all
select
substring(database_names_tail, nullif(charindex(',', database_names_tail, 1), 0) + 1, len(database_names_tail) + 1),
rtrim(ltrim(left(database_names_tail, isnull(nullif(charindex(',', database_names_tail, 1), 0) - 1, len(database_names_tail)))))
from database_name_table db
where
database_names_tail is not null
),
database_names_with_indicator(database_name, indicator) as
(
select
db_name(db_id(case when database_name like '-%' then rtrim(ltrim(substring(database_name, 2, len(database_name)))) else database_name end)),
case when database_name like '-%' then 1 else 0 end
from database_name_table db
where db_name(db_id(case when database_name like '-%' then rtrim(ltrim(substring(database_name, 2, len(database_name)))) else database_name end)) is not null
)
insert @database_names_table (name)
select name
from sys.databases db
where
db.name not in ('master', 'model', 'tempdb', 'msdb') -- системные базы данных обычно не требуется переиндексировать
and db.name not in (select dbi.database_name from database_names_with_indicator dbi where indicator = 1)
and ((select top 1 dbi.database_name from database_names_with_indicator dbi where indicator = 0) is null or
db.name in (select dbi.database_name from database_names_with_indicator dbi where indicator = 0))
;
print '-- ' + convert(nvarchar(max), getdate(), 121) + ' -- найдено ' + convert(nvarchar(max), @@rowcount) + ' баз данных для обслуживания'

print '-- ' + convert(nvarchar(max), getdate(), 121) + ' -- Поиск индексов для обслуживания'
-- курсором обходим выбранные БД и ищем индексы и данные по их фрагментации
declare @database_cursor as cursor;
declare @current_database as nvarchar(128);
set @database_cursor = cursor forward_only for
select name from @database_names_table;
open @database_cursor;
fetch @database_cursor into @current_database;

while (@@FETCH_STATUS = 0)
begin

insert #index_stats
(database_id, object_id, index_id, index_type_desc, avg_fragmentation_in_percent,
page_count, avg_page_space_used_in_percent, record_count)
select
database_id, object_id, index_id, index_type_desc, max(avg_fragmentation_in_percent),
sum(page_count), sum(avg_page_space_used_in_percent*page_count)/isnull(nullif(sum(page_count),0),1), sum(record_count)
from
sys.dm_db_index_physical_stats( db_id(@current_database), null, null, null, 'DETAILED') ips
where
ips.index_id>0 -- убираем кучи (heap)
and ips.index_type_desc in (N'CLUSTERED INDEX', N'NONCLUSTERED INDEX') -- всякие хитрые индексы не обрабатываем
and ips.alloc_unit_type_desc = N'IN_ROW_DATA' -- обрабатываем только по "обычным" записям
and ips.index_level = 0
group by database_id, object_id, index_id, index_type_desc
having sum(page_count)*8 >= @index_size_threshhold

exec ('use [' + @current_database + '];
update i
set
i.db_name = db_name(),
i.table_name = t.name,
i.schema_name = s.name,
i.index_name = ci.name
from #index_stats i
left join sys.tables t on i.object_id = t.object_id
left join sys.schemas s on t.schema_id = s.schema_id
left join sys.indexes ci on i.object_id = ci.object_id and i.index_id = ci.index_id
where
i.database_id = db_id();');

fetch @database_cursor into @current_database;
end;

use master;
close @database_cursor;
deallocate @database_cursor;

declare @WithOptionsRebuild nvarchar(100) = 'WITH (SORT_IN_TEMPDB = ON); '; -- в Enterprise/Developer можно добавить в скобки ", ONLINE = ON"

print '-- ' + convert(nvarchar(max), getdate(), 121) + ' -- Обработка найденных индексов'
-- Курсором обходим выбранные индексы и ищем те, которые надо обслуживать в порядке убывания размера (без упорядочнивания по БД!)
declare @index_cursor as cursor;
set @index_cursor = cursor forward_only for
select
'ALTER INDEX ' + i.index_name + ' ON [' + i.db_name + '].[' + i.schema_name + '].[' + i.table_name + '] ' +
case
when @index_rebuild_threshhold <= i.avg_fragmentation_in_percent then 'REBUILD ' + @WithOptionsRebuild
when @index_rebuild_space_used_threshhold >= i.avg_page_space_used_in_percent then 'REBUILD ' + @WithOptionsRebuild
when @index_defrag_threshhold <= i.avg_fragmentation_in_percent then 'REORGANIZE '
end sql_command,
case -- оценка влияния на журнал транзакций (неточная!)
when @index_rebuild_threshhold <= i.avg_fragmentation_in_percent then i.page_count*8
when @index_rebuild_space_used_threshhold >= i.avg_page_space_used_in_percent then i.page_count*8
when @index_defrag_threshhold <= i.avg_fragmentation_in_percent then i.page_count*8*4*i.avg_fragmentation_in_percent/100
end size
from #index_stats i
where
@index_rebuild_threshhold <= i.avg_fragmentation_in_percent or
@index_defrag_threshhold <= i.avg_fragmentation_in_percent or
@index_rebuild_space_used_threshhold >= i.avg_page_space_used_in_percent
order by i.page_count desc

declare @database_id as smallint;
declare @object_id as int;
declare @index_id as int;
declare @partition_number as int;
declare @sql nvarchar(max);
declare @size numeric(20,4);

open @index_cursor;
fetch @index_cursor into @sql, @size;

print '-- ' + convert(nvarchar(max), getdate(), 121) + ' -- Начало обновления индексов'

while (@@FETCH_STATUS = 0)
begin
set @max_size = @max_size - @size;

print '';
print '-- ' + convert(nvarchar(max), getdate(), 121);
print @sql;
print '-- Размер индекса: ' + cast(@size as nvarchar(max));
print '-- Остаток @max_size: ' + cast(@max_size as nvarchar(max));

if (@is_emulate = 0)
exec(@sql);

if (@timeout_datetime begin
print '-- Выполнение прекращено по таймауту!';
break;
end;
if (@max_size<0)
begin
print '-- Достигнут предел обслуживаемого размера, выполнение прекращено!';
break;
end;

fetch @index_cursor into @sql, @size;
end;

print '-- ' + convert(nvarchar(max), getdate(), 121) + ' -- Окончание обновления индексов'

close @index_cursor;
deallocate @index_cursor;

-- обновление частотных статистик
declare @dbstat_cursor as cursor;
set @dbstat_cursor = cursor forward_only for
select 'use [' + d.name + ']; exec sp_updatestats @resample = ''resample'';'
from @database_names_table d

print '-- ' + convert(nvarchar(max), getdate(), 121) + ' -- Начало обновления частотных статистик'

open @dbstat_cursor;
fetch @dbstat_cursor into @sql;

while (@@FETCH_STATUS = 0)
begin

print '';
print '-- ' + convert(nvarchar(max), getdate(), 121);
print @sql;

if (@is_emulate = 0)
exec(@sql);

if (@timeout_datetime begin
print '-- Выполнение прекращено по таймауту!';
break;
end;
fetch @dbstat_cursor into @sql;
end;

print '-- ' + convert(nvarchar(max), getdate(), 121) + ' -- Окончание обновления частотных статистик'

if (@is_emulate = 1)
select * from #index_stats i order by i.avg_fragmentation_in_percent desc


drop table #index_stats;
[/CODE]
Проверка отправки почты Битрикса из консоли BitrixVM, Если при отправке используется msmtp который часто используют вместо sendmail, то можно проверить как проходит отправка из консоли сервера
 
В первую очередь можно посмотреть в админке битрикса:

Раздел настройки производительность- Таблицы

Находим таблицу:
[CODE]b_event
[/CODE]
[URL=http://vash-site.ru/bitrix/admin/perfmon_tables.php?lang=ru]http://vash-site.ru/bitrix/admin/perfmon_tables.php?lang=ru[/URL] (замените имя сайта)



[CODE]echo -e "test message" | /usr/bin/msmtp --debug -t -i vash@e-mail.ru
[/CODE]в моем случае была настроена яндекс почта.
[CODE]loaded system configuration file /etc/msmtprc
ignoring user configuration file /root/.msmtprc: No such file or directory
falling back to default account
using account default from /etc/msmtprc
host = smtp.yandex.ru
port = 587
timeout = off
protocol = smtp
domain = localhost
auth = choose
user = vash@user
...


<-- 250 2.0.0 Ok: queued on iva1-bc1861525829.qloud-c.yandex.net as 1614238010-Jtoq7IyRGg-QnJ0ToLm
--> QUIT
<-- 221 2.0.0 Closing connection.
[/CODE]Если видим в конце 2.0.0 Ок значит письмо уходит, в противном случае будет четко видно почему не отправляется почта
например для Яндекс аккаунта может потребоваться добавить пароль приложения
и команда будет показывать что логин и пароль не правильный
Exchange 2010 не доходят письма отправителей добавляем в белый список адресов, Если не доходят письма до сотрудников компании exchange как добавить в белый список
 

При наличии жалоб на недоставку писем от адресатов, выясняем адресата или получателя

В excahgne managament shell смотрим письма:

в состоянии FAIL - т.е не доставленные:

команда:
смотрим за последние 12 часов по получателю:
Замените в команде poluchatel@* - на нужное значение например: [URL=mailto:vasya@mail.ru]vasya@mail.ru[/URL]

[CODE]Get-MessageTrackingLog -Start (Get-Date).AddHours(-12) -ResultSize unlimited | where {[string]$_.recipients -like "poluchatel@*"}
[/CODE]

если нужны подробности добавить к команде " | fl sender, recipients, timestamp, recipientstatus, messageinfo"

[CODE]Get-MessageTrackingLog -Start (Get-Date).AddHours(-12) -ResultSize unlimited | where {[string]$_.recipients -like "poluchatel@*"} | fl sender, recipients, timestamp, recipientstatus, messageinfo
[/CODE]

Вот ещё варианты поиска
по отправителю c экспортом в файл

service@emailservice - заменить на отправителя:

[CODE]Get-MessageTrackingLog -Start (Get-Date).AddHours(-12) -ResultSize unlimited | where {[string]$_.sender -like "service@emailservice"} |export-csv c:\mail-logs.csv -notype
[/CODE]

Также для поиска только не доставленных можно добавить : -EventID "FAIL"

[B]РЕШЕНИЕ:[/B]

Добавляем фильтр в список белых адресов целиком для домена:
domen_otpravitela.com - замените на домен отправителя

[CODE]Set-ContentFilterConfig -BypassedSenderDomains domen_otpravitela.com
[/CODE]
Работа с разрешениями на папки в Remote Desctop Manager, Как настраивать разрешения для допольнительных пользователей с ограниченными правами в RDM
 
настройка RDM пункт первый относится к верхнему разделу хранилища

1. Запретить в корне Подключение(выполнение);


2. для Дополнительного пользователя с ограниченными правами необходимо использовать "Ограниченного пользователя" или просто "пользователя Только чтение", то что

Конкретные разрешения для пользователей - разрешить в настройках конкретных папок (под папок) в хранилище (первый уровень хранилища);


3. если пользователю доверяем и он может держать пароли в актуальном состоянии и информацию добавлять - то это уровень обычного пользователя. (Т.е администратора или "пользователь")
1
4
5
6
7
8
9
10
11
12
13