Очистка истории RDP подключений в Windows
Встроенный Remote Desktop Connection (RDP) клиент Windows (mstsc.exe) при каждом успешном соединении с удаленным компьютером сохраняет в системе его имя (или ip адрес) и имя пользователя, под которым был выполнен вход. При следующем запуске клиент RDP предлагает пользователю выбрать одно из подключений, которыми он уже пользовался ранее. Пользователь может выбрать из списка имя удаленного RDP/RDS сервера, и клиент автоматически подставляет используемое ранее для входа имя пользователя.
Это удобно с точки зрения конечного пользователя, но не безопасно. Особенно, когда вы подключаетесь к своему RDP серверу с общедоступного или недоверенного компьютера.
Информация о всех RDP сессиях хранится индивидуально для каждого пользователя компьютера в реестре, т.е. обычный пользователь (не администратор) не сможет просмотреть историю удаленных подключений другого пользователя.
В этой статье мы покажем, где в Windows хранится история подключений к удаленным рабочим столам и сохраненные пароли, и каким образом можно эту историю очистить.
Удаление журнала RDP подключений из реестра системы
- Откройте редактор реестра regedit.exe и перейдите в ветку HKEY_CURRENT_USER\Software\Microsoft\TerminalServerClient;
- Внутри этого раздела нас интересуют две ветки: Default (хранит историю о 10 последних RDP подключениях) и Servers (содержит список всех RDP серверов и имен пользователей, используемых ранее для входа);
- Разверните ветку реестра HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Default, в которой содержится список 10 адресов или имен удаленных компьютеров, которые использовались последними (MRU – Most Recently Used). Имя (IP адрес) удаленного сервера хранится в значении ключа MRU*. Чтобы очистить историю последних RDP-соединений, выделите все ключи с именами MRU0-MRU9, щелкните правой клавишей и выберите пункт Delete;
- Теперь разверните ветку HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Servers. В ней содержится список всех RDP подключений, которые использовались ранее под этим пользователем. Разверните ветку с именем (IP адресом) любого хоста. Обратите внимание на значение параметра UsernameHint (подсказка имени пользователя). В нем указано имя пользователя, использующееся для подключения к RDP/RDS хосту. Именно это имя пользователя будет подставлено в окно клиента mstsc.exe, когда вы в следующий раз попытаетесь подключится к этому хосту. Кроме того в переменной CertHash находится отпечаток RDP сертификата сервера (см. статью о настройке доверенных TLS/SSL сертфикатов для RDP);
- Чтобы очистить историю всех RDP-подключений и сохраненных имен пользователей нужно очистить содержимое ветки реестра Servers. Т.к. выделить все вложенные ветки не получится, проще всего удалить ветку Servers целиком, а затем пересоздать ее вручную;
- Кроме указанных выше параметров и веток реестра, вам необходимо удалить файл дефолтного RDP подключения Default.rdp. В этом файле хранится информацию о самом последнем RDP подключении. Файл является скрытым и находится в каталоге Documents (Документы);
- Windows также сохраняет историю RDP подключений в списках быстрого перехода (jump lists). Если вы наберете в поисковой строке Windows 10 mstsc , то в списке появится ранее использованные RDP подключения. Вы можете отключить ведение истории быстрого перехода с помощью dword параметра реестра Start_TrackDocs в ветке HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced , либо можно очистить списки Resent Items, удалив файлы в каталоге %AppData%\Microsoft\Windows\Recent\AutomaticDestinations .
Скрипт очистки истории (логов) RDP подключений
Выше мы показали, как вручную очистить историю RDP подключений в Windows. Однако делать это вручную (особенно на нескольких компьютерах) – занятие достаточно долгое. Поэтому мы предлагаем небольшой скрипт (bat-файл), который позволяет автоматически очистить историю подключений к удаленным рабочим столам.
Для автоматизации очистки истории RDP, данный скрипт можно поместить в автозагрузку, либо распространить его на компьютеры пользователей с помощью логоф скрипта групповой политики.
@echo off
reg delete «HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Default» /va /f
reg delete «HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Servers» /f
reg add «HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Servers»
attrib -s -h %userprofile%\documents\Default.rdp
del %userprofile%\documents\Default.rdp
del /f /s /q /a %AppData%\Microsoft\Windows\Recent\AutomaticDestinations
Последовательно разберем все команды скрипта:
- Отключен вывод информации в консоль;
- Удаление всех параметров в ветке HKCU\Software\Microsoft\Terminal Server Client\Default (очистка списка последних 10 RDP соединений);
- Удаление ветки HKCU\Software\Microsoft\Terminal Server Client\Servers вместе с вложенными элементами (очистка списка всех RDP подключений и сохраненных имен пользователей);
- Пересоздаем ветку реестра Servers;
- Убираем атрибуты Скрытый и Системный у файла default.rdp в каталоге профиля текущего пользователя;
- Удаление файла default.rdp;
- Очистка Recent Items.
Вы можете скачать готовый скрипт тут: CleanRDPHistory.bat
Кроме того, можно очистить историю подключений RDP с помощью следующего PowerShell скрипта:
Get-ChildItem «HKCU:\Software\Microsoft\Terminal Server Client» -Recurse | Remove-ItemProperty -Name UsernameHint -Ea 0
Remove-Item -Path ‘HKCU:\Software\Microsoft\Terminal Server Client\servers’ -Recurse 2>&1 | Out-Null
Remove-ItemProperty -Path ‘HKCU:\Software\Microsoft\Terminal Server Client\Default’ ‘MR*’ 2>&1 | Out-Null
$docsfoldes = [environment]::getfolderpath(«mydocuments») + ‘\Default.rdp’
remove-item $docsfoldes -Force 2>&1 | Out-Null
Как запретить Windows сохранять историю RDP подключений?
Если вы хотите, чтобы Windows не сохраняла историю RDP подключений, нужно запретить запись в ветку реестра HKCU\Software\Microsoft\Terminal Server Client для всех аккаунтов, в том числе System. Сначала отключите наследование разрешений на указанную ветку (Permissions -> Advanced -> Disable inheritance). Затем измените ACL на ветку, выставив Deny галочку для пользователей (но, вы должны понимать, что это уже unsupported configuration…).
В результате mstsc просто не сможет записать информацию об RDP подключении в реестр.
Очистка Bitmap кэша RDP
В клиенте Remote Desktop Connection есть функционал кэширования изображений (persistent bitmap caching). Клиент RDP при подключении сохраняет редко изменяющиеся куски удаленого экрана в виде кэша растровых изображений. Благодаря этому клиент mstsc.exe загружает из локального кэша части экрана, которые не изменились с момента последней прорисовки. Этот механизм кэширования RDP уменьшает количество данных, передаваемых по сети.
RDP кэш представляет собой два типа файлов в каталоге %LOCALAPPDATA%\Microsoft\Terminal Server Client\Cache :
В этих файлах хранятся сырые растровые изображения RDP экрана в виде плиток 64×64 пикселя. С помощью простых PowerShell или Python скриптов (легко ищутся по запросу RDP Cached Bitmap Extractor) можно получить PNG файлы с кусками экрана рабочего стола и использовать их для получения конфиденциальной информации. Размер плиток мал, но достаточен для получения полезной информации для изучающего RDP кэш.
Вы можете запретить RDP клиенту сохранять изображение экрана в кэш, отключив опцию Persistent bitmap caching (Постоянное кэширование точечных рисунков) на вкладке Advanced.
В этом случае нужно очистить каталог RDP кэша или отключить опцию Bitmap Caching.
Удаление сохраненных RDP паролей
Если при установке удалённого RDP подключения, перед вводом пароля пользователь поставил галку Remember Me / Запомнить меня, то имя пользователя и пароль будут сохранены в системном менеджере паролей системы (Credential Manager). При следующем подключении к этому же компьютеру, RDP клиент автоматически использует сохранённый ранее пароль для авторизации на удаленном компьютере.
Вы можете удалить сохраненный пароль прямо из окна клиента mstsc.exe. Выберите в списке подключений тоже самое подключение, и нажмите на кнопку Delete. Далее подтвердите удаление сохраненного пароля.
Либо можно удалить сохраненный пароль непосредственно из менеджера паролей Windows. Перейдите в следующий раздел Панели Управления: Control Panel\User Accounts\Credential Manager. Выберите Manage Windows Credentials и в списке сохранённых паролей найдите имя компьютера (в формате TERMSRV/192.168.1.100 ). Разверните найденный элемент и нажмите на кнопку Remove.
В доменной среде вы можете запретить сохранение паролей для RDP подключений можно с помощью политики Network access: Do not allow storage of passwords and credentials for network authentication (см. статью).
Очистка RDP логов на сервере
Логи подключения так же ведутся на стороне RDP/RDS сервера. Вы можете найти информацию об RDP подключениях в логах Event Viewer:
- Security;
- Applications and Services Logs -> Microsoft -> Windows -> TerminalServices-RemoteConnectionManager -> Operational;
- TerminalServices-LocalSessionManager -> Admin.
Очистка кэша 1С8 на RDS ферме, за минуту
Очистка кэша 1С8 на RDS ферме, за минуту
Добрый день! Уважаемые читатели и гости одного из крупнейших IT блогов рунета Pyatilistnik.org. В прошлый раз мы с вами научились при в ходя пользователя на терминальный стол, подключать ему нужный список баз 1С, что согласитесь очень удобная вещь. Сегодня я с вами хочу поговорить про очистку кэша 1С у конкретного пользователя или у всех сразу, при входе в систему или в ручном режиме. Мы рассмотрим, что из себя представляет кэш и его назначение. Тема для меня была в новинку, поэтому я решил ее сохранить для себя, чтобы легко к ней можно было обратиться в будущем.
Для чего и что лежит в кэше 1С?
Уверен, что подавляющее число людей, даже те кто далек от IT технологий, понимает смысл слова кэширование, так как оно применяется очень часто в разных продуктах. Кэширование — это механизм ускорения приложения, создающий в памяти устройства, дисках локальные копии данных к которым пользователь обращается чаще всего. Благодаря такой конструкции пользователь считывает их у себя локально быстрее, нежели он бы обратился к серверу. Благодаря этому вы уменьшаете нагрузку на сеть, на удаленный сервер, который может обработать большее количество клиентов, например у меня на сайте настроено кэширование, которое позволяет увеличь его скорость в разы.
Когда пользователь запускает «1C Предприятие» и открывает нужную ему базу данных, у него в профиле создается папка с файлами в которой будет складываться кэш 1С. В кэш могут попадать настройки шрифта, цвет, расположение окон и тому подобное, элементы ускорения работы 1С, какие-то служебные данные.
Папки расположения кэша 1С
Для того, чтобы посмотреть содержимое кэша вам необходимо перейти вот по таки путям:
Для версии 1С 8.2
обратите внимание, что чаще всего кэш выглядит вот так некий GUID (589e052f-cbeb-41bf-a459-ebcfa8f5e27d) в виде папки, в которой лежит файл формата .pfl.
Для чего чистить кэш 1С?
К сожалению 1С, как и практически любой другой софт не могут работать всегда корректно и без ошибок. Я по несколько раз в неделю могу наблюдать случаи, что «1C Предприятие» неправильно работает с кэшированной конфигурацией, в результате чего у вас будет неадекватное поведение в данной конфигурации.
Лично я искал решение (Гипотеза) с зависанием терминального сервера, в логах которого я наблюдал вот такие ошибки:
1000
2
100
0x80000000000000
2819141
Application
—
1cv8.exe
8.3.14.1630
5c6e4d23
wbase83.dll
8.3.14.1630
5c6e4bb7
c0000005
00006844
7834
01d536fbd27b0449
C:\Program Files (x86)\1cv8\8.3.14.1630\bin\1cv8.exe
C:\Program Files (x86)\1cv8\8.3.14.1630\bin\wbase83.dll
638a47cf-a2f1-11e9-8156-0050568dcf1e
Методы очистки кэша 1С
Существует несколько методов и сценариев, которые можно использовать при работе с приложением:
- Ручная очистка папки с кэшем
- Очистка кэша пользователя 1с с помощью PowerShell скрипта
- Очистка с помощью скрипта cmd
- Через редактирование информационной базы
- Через утилиту OneCleaner.exe
Несколько сценариев из практики:
- Использование скрипта при входе в систему, тут не важно будет это cmd или PowerShell
- Создание у пользователя ярлыка или скопированного файла, например на рабочем столе для ручного, самостоятельного запуска.
Ручная очистка папки с кэшем 1С
- Открываем по очереди папки представленные выше в моем списке,
- закрываем все версии «1C Предприятие» и
- удаляем папки с GUID. Как можете заметить, что данный метод очень трудоемкий для пользователя, так как требует много действий. Я его показал, чтобы вы поняли азу процесса.
Удаление кэша 1C предприятия через PowerShell
PowerShell это инструмент номер 1 в руках системного администратора, благодаря ему вы можете автоматизировать огромное количество задач.
- Очистка папок с кэшем для одного пользователя:
- Очистка кэша для всех пользователей, например для RDS фермы
Благодаря PowerShell вы можете выполнить более правильное удаление, так как затрагиваются только папки с кэшем GUID, пользовательские настройки остаются, в отличии от CMD.
Удаление кэша 1C предприятия через CMD
Командная строка, это один из самых старых и действенных методов по выполнению различных сценариев в Windows, пока даже PowerShell не может ее полностью заменить, например он не умеет делать команду ipconfig /release или ipconfig /renew. Для командной строки есть такие сценарии:
If Exist %USERPROFILE%\AppData\Roaming\1C\1Cv82 (
Удаление кэша 1C предприятия через JavaScript
WScript.Echo(«Будет выполнена очистка кэша 1с»);
var _fso = new ActiveXObject(«Scripting.Filesystemobject»);
var _wShell = new ActiveXObject(«WScript.Shell»);
var _wshNetwork = new ActiveXObject(«WScript.Network»);
var wmi = «winmgmts:!\\\\.\\root\\CIMV2″;
var _wmi = GetObject(wmi);
var _win_ver = _wShell.ExpandEnvironmentStrings(_wShell.RegRead(«HKEY_LOCAL _MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\CurrentVersion»));
var _profiles_path = _wShell.ExpandEnvironmentStrings(_wShell.RegRead(«HKEY _LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\ProfileList\\ProfilesDirectory»))
var _user_profile = _wShell.ExpandEnvironmentStrings(«%USERPROFILE%»);
var _clear_all = _parse_bool_argument(«ClearAll»);
var _pids = «»;
var stop_1cv8 = ‘cmd /c taskkill.exe /f /im 1cv8*’;
var stop_1cestart = ‘cmd /c taskkill.exe /f /im 1cestart.exe’;
var stop_1c_part = ‘cmd /c taskkill.exe /f /pid ‘
var _sel_logged_users = «SELECT * FROM Win32_LoggedOnUser»;
var _sel_sesn_prcs = «SELECT * FROM Win32_SessionProcess»;
var _sel_prcs_by_pid = «SELECT * FROM Win32_Process WHERE (Name like ‘1cv8%’ or Name like ‘1cestart%’) and («;
var vbYesNo = 4;
var vbYes = 6;
var exceptDirectories = [«1CEStart»,»Licence 2.0″,»tmplts»];
var exceptFiles = [«LOCATION.CFG»,»1CV8STRT.PFL»,»APPSRVRS.LST»,»IBASES.V8I»];
if(_win_ver == «5.1») <
var user_app_1c = «\\Application Data\\1C»
var user_lcl_1c = «\\Local Settings\\1C»
>else <
var user_app_1c = «\\AppData\\Roaming\\1C»
var user_lcl_1c = «\\AppData\\Local\\1C»;
>
//киляем процессы 1с
log_w(«Started by «+_wshNetwork.UserDomain+»\\»+_wshNetwork.UserName);
if(_clear_all) <
log_w(«Очищаю кэш 1С для всех профилей»);
if(!_parse_bool_argument(«DontClose1cClient»)) <
log_w(«Завершаю работу всех клиентов 1С»);
RunAndRead(stop_1cv8);
RunAndRead(stop_1cestart);
>
_profiles = new Enumerator(_fso.GetFolder(_profiles_path).SubFolders);
for (;!_profiles.atEnd(); _profiles.moveNext()) <
_clean_profile(_profiles.item());
>
>else <
log_w(«Очищаю кэш текущего пользователя»);
for(var logged_users = new Enumerator(_wmi.ExecQuery(_sel_logged_users));!logged_users.atEnd(); logged_users.moveNext()) <
var acc = logged_users.item().Antecedent;
var logon_id = logged_users.item().Dependent;
var _logged_user_rexp = eval(«/»+_wshNetwork.UserName+»/gi»);
if(_logged_user_rexp.test(acc)) <
for(var sess_prcs = new Enumerator(_wmi.ExecQuery(_sel_sesn_prcs));!sess_prcs.atEnd(); sess_prcs.moveNext()) <
var p1 = sess_prcs.item().Antecedent;
var p2 = sess_prcs.item().Dependent;
var _pid_rexp = /Handle=»\d+»/gi;
if(p1 == logon_id) <
_pids += _pid_rexp.test(p2)?»ProcessId=»+((p2.match(_pid_rexp))[0]).replace(‘Handle=»‘,»»).replace(‘»‘,»»)+» or «:»»;
>
>
//WScript.Echo(logon_id);
>
>
_pids = _pids.replace(/\sor\s$/gi,»»)
//WScript.Echo(_pids);
var _sel_only_my_1c = _sel_prcs_by_pid+_pids+»)»;
var c1s = new Enumerator(_wmi.ExecQuery(_sel_only_my_1c));
if((!c1s.atEnd())&&(_wShell.popup(«Для продолжения необходимо закрыть 1с. Продолжаем?»,0,»Подтверждение»,vbYesNo)==vbYes)) <
log_w(«Получено согласие на закртие клиентов 1С текущего пользователя»);
for(;!c1s.atEnd();c1s.moveNext()) <
c1s_cl = c1s.item();
if(!_parse_bool_argument(«DontClose1cClient»)) <
cmd = stop_1c_part+c1s_cl.ProcessID;
log_w(«Завершаю «+cmd);
RunAndRead(cmd);
>
>
>
_clean_profile(_user_profile);
>
WScript.Echo(«Кэш очищен»);
function _parse_bool_argument(pa_arg_name) <
var pa_string = «»;
for(var pa_i = 0; pa_i «‘+rar_outname+'»‘;
rar_VSH.run(rar_str, 0, true);
if(rar_FSO.fileexists(rar_outname)) <
if(rar_FSO.getfile(rar_outname).size>0) <
var rar_in = rar_FSO.opentextfile(rar_outname);
var rar_ret = rar_in.readall();
rar_in.close();
>
else
rar_FSO.deletefile(rar_outname);
>else
rar_FSO = null;
rar_VSH = null;
rar_outname = null;
rar_str = null;
rar_in = null;
return rar_ret.replace(/^\r\n|(\r\n)<2,>|\r\n$/gi,»»);
>
function _clean_profile(cp_path) <
if(_fso.folderexists(cp_path+»\\»+user_app_1c)) <
ClearSubFolders(cp_path+»\\»+user_app_1c)
>
if(_fso.folderexists(cp_path+»\\»+user_lcl_1c)) <
ClearSubFolders(cp_path+»\\»+user_lcl_1c)
>
>
function ClearSubFolders(objFolder) <
var subfolder;
var filename;
var csf_subfolders = new Enumerator(_fso.GetFolder(objFolder).SubFolders);
for(;!csf_subfolders.atEnd();csf_subfolders.moveNext()) <
subfolder = csf_subfolders.item()
if(!in_array(subfolder.name,exceptDirectories)) <
var sf_path = subfolder.Path;
log_w(«Очищаю «+sf_path);
ClearSubFolders(sf_path)
try <
if(/1cv8\d*/gi.test(subfolder.Name)) <
RunAndRead(‘cmd /c rmdir «‘+sf_path+'»‘)
>else <
RunAndRead(‘cmd /c rmdir /S /Q «‘+sf_path+'»‘)
>
>catch(e) <
log_w(«Не смог удалить «+sf_path);
>
>else <
log_w(subfolder.Path + » в списке исключений»);
>
>
var csf_files = new Enumerator(_fso.GetFolder(objFolder).Files)
for(;!csf_files.atEnd();csf_files.moveNext()) <
var ffile = csf_files.item();
var fname = ffile.Path;
if(!in_array(ffile.name,exceptFiles)) <
try <
_fso.deletefile(ffile);
log_w(«Удалён «+fname);
>catch(e) <
log_w(«Не смог удалить «+fname);
>;
>
>
>
function log_w(lw_text_t) <
return;
var wait_limit = 999;
var wait_count = 0;
var lw_recorded = false
while(!lw_recorded) <
if(wait_count 9)?dateObj.getMonth()+1:»0″+(dateObj.getMonth()+1))+».»
+((dateObj.getDate()>9)?dateObj.getDate():»0″+dateObj.getDate())+»-»
+((dateObj.getHours()>9)?dateObj.getHours():»0″+dateObj.getHours())+»:»
+((dateObj.getMinutes()>9)?dateObj.getMinutes():»0″+dateObj.getMinutes())+»:»
+((dateObj.getSeconds()>9)?dateObj.getSeconds():»0″+dateObj.getSeconds())+»:»
+((dateObj.getMilliseconds()>99)?dateObj.getMilliseconds():((dateObj.getMilliseconds()>9)?»0″+dateObj.getMilliseconds():»00″+dateObj.getMilliseconds()))+»=»
+lw_text_t);
lw_log_file.close();
lw_log_file = null;
lw_fso = null;
lw_log = null;
dateObj = null;
lw_recorded = true;
>
catch(e) <
WScript.Sleep(100);
wait_count++;
lw_recorded = false;
>
>
else <
WScript.Echo(«Не смог записать сообщение «+lw_text_t+»\r\nв файл «+WScript.ScriptFullName+».log»);
lw_recorded = true;
>
>
>
Очистка кэша 1С через OneCleaner.exe
OneCleaner.exe — это удобная, бесплатная утилита, которая поможет вам легко удалять некорректный кэш.
Запустив OneCleaner.exe она вам на вкладке «Кэш» покажет, что можно удалить, для действия нажимаем соответствующую кнопку.
Так же утилита может удалять старые платформы 1С, если потребуется, в любом случае полезная вещь.
Удаление кэша 1C предприятия через редактирование информационной базы
Необходимо в дополнительных параметрах запуска (в списке баз кнопка Изменить, последняя закладка) прописать команду /ClearCache. Пример использования:
Сценарии удаления кэша с групповой политикой
Как я и писал у вас два варианта, полная автоматизация при входе пользователя или выходе, минус в том что вы создадите большую нагрузку на сервер, но уменьшите возможные проблемы с работой платформы. Для этого готовим или cmd скрипт или PowerShell, создаем групповую политику для пользователя, не забываем убрать 5-ти минутную задержку выполнения скрипта.
Мне же больше по душе, это либо преобразовать скрипт PowerShell в EXE файл, скопировать через групповые политики на рабочий стол пользователя, чтобы он потом его легко сам запускал в нужный момент, так же подойдет и копирование bat файла или javascrip, это не важно, главное, что пользователь сможет сам его запустить. Как копировать файлы через групповую политику читаем по ссылке.
























