Как узнать кто заблокировал файл эксель
Администраторы файловых серверов Windows часто сталкиваются с необходимостью принудительного закрытия файлов, открытых пользователями. Такая задача возникает при одновременной работы с одним файлом нескольких пользователей. Часто при некорректной работе ПО или неправильном завершении сессии пользователем, файлы в сетевой папке оказываются открытыми и заблокированными, и остальные пользователи не могут вносить в него изменения. В этой статье мы покажем, как получить список открытых файлов на файловом сервере, узнать какие пользователи их используют, и способы сброса этих файловых сессий.
Вывести список открытых файлов на файловом сервере Windows
Список открытых пользователями файлов на файловом сервере Windows можно получить с помощью стандартной графической консоли Computer Management (Управление компьютером — compmgmt.msc ).
Запустите на файловом сервере консоль Computer Management (или подключитесь к нему удаленно консолью со своего компьютера) и перейдите в секцию System Tools -> Shared Folders -> Open files (Служебные программы -> Общие папки -> Открыты файлы). В правой части окна отображается список файлов сервера, открытых удаленно . Список содержит локальный путь к файлу, имя учетной записи пользователя, количество блокировок и режим, в котором открыт файл (Read или Write+Read).
Этот же список открытых файлов можно получит с помощью встроенной консольной утилиты Openfiles . Например, с помощью следующей команды можно получить id сессии, имя пользователя и полный локальный путь к открытому файлу:
Openfiles /Query /fo csv |more
При удаленном доступе пользователя к папке или файлу в сетевой папке (SMB) на сервере, для пользователя создается новая сессия, определяющая данное подключение. Управление подключениями пользователей осуществляется именно через эти идентификаторы сессий.
Эту же команду можно выполнить удаленно, например, нужен список открытых файлов на файловом сервере mskfs01:
Openfiles /Query /s mskfs01 /fo csv
У команды Openfiles есть еще одна интересная возможность просмотра списка локально открытых файлов. Для ее использования нужно включить опцию Maintain Objects List (Построение списка объектов) командой openfiles /local on и перезагрузить сервер. После этого в список начнут попадать файлы, открытые локальными процессами (этот режим желательно использовать только для отладки, т.к. может негативно сказаться на производительности сервера).
Как определить какой пользователь открыл файл
Чтобы определить пользователя, который открыл (заблокировал) файл cons.adm на сервере, выполните команду:
Openfiles /Query /s mskfs01 /fo csv | find /i "cons.adm"
Ключ /i используется, чтобы выполнялся регистронезависимый поиск
Естественно, можно указать только часть имени файла. К примеру, нам нужно узнать кто открыл xlsx файл, в имени которого есть строка farm, воспользуемся таким конвейером:
Openfiles /Query /s mskfs01 /fo csv | find /i "farm"| find /i "xlsx"
Можно, конечно найти файл и в графической консоли Computer Management, но это менее удобно (консоль не предусматривает возможность поиска).
Как закрыть открытый файл
Чтобы закрыть открытый файл, нужно найти его в списке файлов секции Open File и в контекстном меню выбрать пункт « Close Open File ».
Если на файловом сервере сотни открытых файлов, найти их в консоли будет непросто. Удобнее воспользоваться утилитой Openfiles . Как мы уже говорили, она возвращает ID сессии открытого файла. Именно по этому ID сессии, файл можно принудительно закрыть, сбросив подключение. Находим ID нужного файла:
Openfiles /Query /s mskfs01 /fo csv | find /i "farm"| find /i ".xlsx"
Отключаем от него пользователя по полученному идентфикатору:
Openfiles /Disconnect /s mskfs01 /ID 67109098
Как удаленно закрыть открытые файлы с помощью PowerShell
В Windows Server 2012 / Windows 8 в PowerShell появились командлеты для работы с шарами и файлами на SMB сервере. Данные командлеты можно использовать для удаленного сброса подключений к открытому файлу.
Список открытых файлов можно получить с помощью командлетов Get- SMBOpenFile , а закрыть файл (сбросить подключение) с помощью Close-SmbOpenFile .
Итак, подключаемся к удаленному серверу:
$sessn = New-CIMSession –Computername mskfs01
Находим и закрываем открытый файл pubs.docx одной командой:
Get-SMBOpenFile -CIMSession $sessn | where | Close-SMBOpenFile -CIMSession $sessn
Подтверждаем закрытие файла, нажав Y.
Чтобы убрать подтверждение принудительного закрытия файла на сервере, используйте ключ -Force
Эти же команды можно использовать, к примеру, чтобы закрыть все файлы, открытые некоторым пользователем (пользователь ушел домой и не освободил файлы). К примеру, чтобы сбросить все файловые сессии для пользователя ipivanov, выполните
Get-SMBOpenFile -CIMSession $sessn | where |Close-SMBOpenFile -CIMSession $sessn
Есть файл с общим доступом. Файл находится на общем сетевом жёстком диске. С этим файлом постоянно работают много человек.
1. Необходимо выяснить, открыт ли у в настоящее время у кого-нибудь из сотрудников данный файл.
2. Желательно выяснить, у кого именно открыт.
Нужно это знать для того, чтобы внести изменения, которые невозможны при включённом общем доступе, и вот для этого нужно его отключить, но лишь в тот момент, когда файл никем не используется (ибо пользователи не смогут сохранить их изменения, если им отрубить общий доступ).
P.s. Доступа к администрированию сетевого ресурса (управление компьютером) нет.
Есть файл с общим доступом. Файл находится на общем сетевом жёстком диске. С этим файлом постоянно работают много человек.
1. Необходимо выяснить, открыт ли у в настоящее время у кого-нибудь из сотрудников данный файл.
2. Желательно выяснить, у кого именно открыт.
Нужно это знать для того, чтобы внести изменения, которые невозможны при включённом общем доступе, и вот для этого нужно его отключить, но лишь в тот момент, когда файл никем не используется (ибо пользователи не смогут сохранить их изменения, если им отрубить общий доступ).
P.s. Доступа к администрированию сетевого ресурса (управление компьютером) нет. Aleksio
Нужно это знать для того, чтобы внести изменения, которые невозможны при включённом общем доступе, и вот для этого нужно его отключить, но лишь в тот момент, когда файл никем не используется (ибо пользователи не смогут сохранить их изменения, если им отрубить общий доступ).
P.s. Доступа к администрированию сетевого ресурса (управление компьютером) нет. Автор - Aleksio
Дата добавления - 26.07.2016 в 23:22
Вкладка "Рецензирование" - Доступ к книге - вкладка "Правка" - в области "Файл открыт следующими пользователями" список пользователей, которые открыли общий файл.
PS. В списке пользователей отображаются только те пользователи, у которых файл открыт в режиме чтения и записи. Если у пользователя ограничены права и он может открыть только в режиме чтения, то такой пользователь не отображается в этом списке.
Вкладка "Рецензирование" - Доступ к книге - вкладка "Правка" - в области "Файл открыт следующими пользователями" список пользователей, которые открыли общий файл.
PS. В списке пользователей отображаются только те пользователи, у которых файл открыт в режиме чтения и записи. Если у пользователя ограничены права и он может открыть только в режиме чтения, то такой пользователь не отображается в этом списке. Karataev
Всем Привет!
По сути весь вопрос в названии.
Имеем файл в общем доступе - Вася, Петя, Катя, Маша.
Как можно узнать, кто именно правит файл в данный момент? В этом же файле.
Всем Привет!
По сути весь вопрос в названии.
Имеем файл в общем доступе - Вася, Петя, Катя, Маша.
Как можно узнать, кто именно правит файл в данный момент? В этом же файле. Michael_S
Sub dd()
Dim wb As Workbook, uSt(), i&
Set wb = Application.Workbooks("shared.xlsx")
uSt = wb.UserStatus
If UBound(uSt) < 2 Then Exit Sub
For i = 1 To UBound(uSt)
If uSt(i, 1) <> Application.UserName Then
Debug.Print "пользователь " & uSt(i, 1) & " открыл книгу " & Format(uSt(i, 2), "dd.MM.yyyy hh:mm")
End If
Next
End Sub
Sub dd()
Dim wb As Workbook, uSt(), i&
Set wb = Application.Workbooks("shared.xlsx")
uSt = wb.UserStatus
If UBound(uSt) < 2 Then Exit Sub
For i = 1 To UBound(uSt)
If uSt(i, 1) <> Application.UserName Then
Debug.Print "пользователь " & uSt(i, 1) & " открыл книгу " & Format(uSt(i, 2), "dd.MM.yyyy hh:mm")
End If
Next
End Sub
Sub dd()
Dim wb As Workbook, uSt(), i&
Set wb = Application.Workbooks("shared.xlsx")
uSt = wb.UserStatus
If UBound(uSt) < 2 Then Exit Sub
For i = 1 To UBound(uSt)
If uSt(i, 1) <> Application.UserName Then
Debug.Print "пользователь " & uSt(i, 1) & " открыл книгу " & Format(uSt(i, 2), "dd.MM.yyyy hh:mm")
End If
Next
End Sub
это имя открытой книги с общим доступом, для которой нужно получить список активных пользователей krosav4ig
это имя открытой книги с общим доступом, для которой нужно получить список активных пользователей Автор - krosav4ig
Дата добавления - 31.10.2016 в 21:52
Michael_S, здравствуйте. Макрос рассчитан на то, чтобы выводить пользователей, кроме текущего, т.е. всех, кроме Вас.
Попробуйте закомментировать строчки с проверкой на количество пользователей и на имя пользователя:
[vba]
Sub dd()
' Узнать имя пользователя
Dim wb As Workbook, uSt(), i&
Set wb = ThisWorkbook
uSt = wb.UserStatus
' If UBound(uSt) < 2 Then Exit Sub
For i = 1 To UBound(uSt)
' If uSt(i, 1) <> Application.UserName Then
Cells(i, 1) = "пользователь " & uSt(i, 1) & " открыл книгу " & Format(uSt(i, 2), "dd.MM.yyyy hh:mm")
' End If
Next
End Sub
Michael_S, здравствуйте. Макрос рассчитан на то, чтобы выводить пользователей, кроме текущего, т.е. всех, кроме Вас.
Попробуйте закомментировать строчки с проверкой на количество пользователей и на имя пользователя:
[vba]
Sub dd()
' Узнать имя пользователя
Dim wb As Workbook, uSt(), i&
Set wb = ThisWorkbook
uSt = wb.UserStatus
' If UBound(uSt) < 2 Then Exit Sub
For i = 1 To UBound(uSt)
' If uSt(i, 1) <> Application.UserName Then
Cells(i, 1) = "пользователь " & uSt(i, 1) & " открыл книгу " & Format(uSt(i, 2), "dd.MM.yyyy hh:mm")
' End If
Next
End Sub
Sub dd()
' Узнать имя пользователя
Dim wb As Workbook, uSt(), i&
Set wb = ThisWorkbook
uSt = wb.UserStatus
' If UBound(uSt) < 2 Then Exit Sub
For i = 1 To UBound(uSt)
' If uSt(i, 1) <> Application.UserName Then
Cells(i, 1) = "пользователь " & uSt(i, 1) & " открыл книгу " & Format(uSt(i, 2), "dd.MM.yyyy hh:mm")
' End If
Next
End Sub
Manyasha, Спасибо!
[p.s.]А как вам удалось сохранить изменения в VВA?
У меня не сохраняет, приходится каждый раз создавать новую книгу
Разобрался
[/p.s.]
Manyasha, Спасибо!
[p.s.]А как вам удалось сохранить изменения в VВA?
У меня не сохраняет, приходится каждый раз создавать новую книгу
Разобрался
[/p.s.] Michael_S
[p.s.]А как вам удалось сохранить изменения в VВA?
У меня не сохраняет, приходится каждый раз создавать новую книгу
Разобрался
[/p.s.] Автор - Michael_S
Дата добавления - 01.11.2016 в 12:50
Михаил, к сожалению это не решит проблему идентификации пользователей книги, размещённой в общем доступе.
Ведь получаете Вы не уникальные в Вашей LAN имена компьютеров, а имена пользователей Офиса, задаваемые при его установке. А они вовсе никак не связаны с именами компьютеров и могут быть любыми.
У нас IT-шники вообще не парятся с этим и всем дают имена User.
А потом кто хочет и может сам это имя сменить на какое угодно.
Михаил, к сожалению это не решит проблему идентификации пользователей книги, размещённой в общем доступе.
Ведь получаете Вы не уникальные в Вашей LAN имена компьютеров, а имена пользователей Офиса, задаваемые при его установке. А они вовсе никак не связаны с именами компьютеров и могут быть любыми.
У нас IT-шники вообще не парятся с этим и всем дают имена User.
А потом кто хочет и может сам это имя сменить на какое угодно. Alex_ST
Леш, это уже проблемы пользователя. Ему надо отметить, кто сделал запись - пусть сам думает, как их различать.
Леш, это уже проблемы пользователя. Ему надо отметить, кто сделал запись - пусть сам думает, как их различать. Michael_S
Ну так по сетевому-то имени можно однозначно комп в домене вычислить, а по имени пользователя Офиса - нет.
А получить сетевое имя ничуть не сложнее:[vba]
Ну так по сетевому-то имени можно однозначно комп в домене вычислить, а по имени пользователя Офиса - нет.
А получить сетевое имя ничуть не сложнее:[vba]
Спасибо, в следующий раз буду иметь ввиду. Кстати, а что там на выходе примерно получается?
В решаемой задаче я другим путем пошел - пароль при открытии файла и соответственное определение пользователя.
Не важно, с чьего компа.
Спасибо, в следующий раз буду иметь ввиду. Кстати, а что там на выходе примерно получается?
В решаемой задаче я другим путем пошел - пароль при открытии файла и соответственное определение пользователя.
Не важно, с чьего компа. Michael_S
На выходе - это где?
В моём примере сетевое имя юзверга просто выводится для наглядности в окно Immediate
На выходе - это где?
В моём примере сетевое имя юзверга просто выводится для наглядности в окно Immediate
Представьте себе книгу Excel с очень важными для вас данными, сохраненную на общем сетевом диске компании, куда имеет доступ куча народу. Одним совсем не прекрасным утром вы открываете этот файл и обнаруживаете, что внутри кто-то поиграл в аль-каиду: формулы поломаны, данные стерты, дизайн нарушен. Поскольку вы опытный пользователь, то у вас, конечно же, была резервная копия этого важного документа (была же, правда?) и данные вы восстановите, но чисто из спортивного интереса хотелось бы все же узнать - КТО ЭТО СДЕЛАЛ?!
Давайте попробуем решить эту задачу. Итак, нам нужно:
- фиксировать на отдельном (скрытом) листе имя пользователя, открывшего файл;
- фиксировать там же дату-время открытия и закрытия файла;
- по возможности усложнить взлом или обход такой защиты.
Этап 1. Создаем "Лог"
Добавим в нашу книгу новый лист, куда будет записываться информация о всех пользователях и назовем его, например, Лог. На нем создадим простую шапку будущего журнала учета посетителей:
Этап 2. Макросы фиксации входа-выхода
Теперь добавим макросы для записи на лист Лог даты-времени и имен пользователей при открытии и закрытии книги. Для этого нужно открыть редактор Visual Basic с помощью сочетания Alt+F11 или с помощью кнопки Visual Basic на вкладке Разработчик (Developer) и найти в левом верхнем углу панель Project (если она не отображается, то включить ее можно сочетанием клавиш Ctrl+R):
Двойным щелчком откройте модуль ЭтаКнига (ThisWorkbook) и вставьте туда пару наших макросов для обработки событий открытия и закрытия книги:
В первом приближении все уже должно работать. Попробуйте открыть-закрыть этот файл пару раз и убедитесь, что на лист Лог попадает ваше имя пользователя (логин входа в Windows) и дата-время:
Этап 3. Улучшаем надежность
Можно было бы скрыть лист Лог и на этом остановиться, но есть одно "но": если у пользователя, который открывает нашу книгу, макросы разрешены по умолчанию либо он сам их разрешает, нажав в окне предупреждения на кнопку Включить содержимое, то все в порядке:
Но что если пользователь не разрешит выполнение макросов или они отключены у него по умолчанию? Тогда наши макросы отслеживания выполняться не будут и фиксации имени и даты не произойдет :( Как же заставить пользователя разрешить использование макросов?
Чтобы обойти эту проблемку воспользуемся небольшой тактической хитростью. Добавьте в нашу книгу еще один чистый лист, назовите его Предупреждение и вставьте на него следующий текст:
Суть в том, чтобы по умолчанию скрыть в книге все листы кроме этого, а рабочие листы с данными отображать с помощью специального макроса. Если пользователь не разрешил выполнение макросов, то он увидит в книге только один лист с предупреждением. Если же макросы разрешены, то наш макрос обработки события открытия книги скроет лист с предупреждением и отобразит листы с данными. Чтобы пользователь сам не отобразил их - используем суперскрытие вместо обычного скрытия листов (параметр xlSheetVeryHidden вместо обычного False).
Чтобы реализовать все описанное, слегка изменим наши процедуры в модуле ЭтаКнига (ThisWorkbook):
Чтобы просмотреть скрытый Лог откройте редактор VisualBasic (Alt+F11), выделите лист на панели Project и измените его видимость на панели Properties, используя свойство Visible:
Если пользователи настолько продвинутые, что знают про суперскрытые листы и могут их отобразить через редактор Visual Basic или нарушить работу наших макросов, то можно дополнительно поставить пароль на просмотр и изменение макросов. Для этого щелкните правой кнопкой мыши по имени файла в панели Project (строка VBAProject (blackbox.xls)), выберите команду VBA Project Properties и включите флажок Lock project for viewing и задайте пароль на вкладке Protection:
Теперь точно никто не уйдет безнаказанным. Большой Брат следит за тобой! ;)
По данным вами ссылкам, результат един:
Да, я Жук, три пары лапок и фасеточные глаза :))
во вложении изображении скриншоты что я хочу видеть
The opinion expressed by me is not an official position of Microsoft
прочтите пожалуйста в начале. что я писал. я хочу в vb получить имя пользователя кто открыл для редактирования файл.
что будет если открыть файл и посмотреть пользователей которые открыли файл? я прочел что вы можете получить список пользюков, но только после того как откроете, а открыть вы не можете потому что файл занят, и именно на последнее я вам и дал предположительный ответ
и еще тут описан воркераунд по вашей теме. и еще одно похожее обсуждение
The opinion expressed by me is not an official position of Microsoft
файл открывается только для чтения. и я не могу узнать кто открыл файл для редактирования. только в начале говорит что занят файл. и каким пользователем. я как понимаю создается файл пользователя с префиксом ~$ и там можно как то узнать кто открыл файл для редактирования.Если верно, то подскажите где в этом файле я могу узнать имя пользователя
На вкладке Правка в списке Файл открыт следующими пользователями просмотрите имена пользователей.
Да, я Жук, три пары лапок и фасеточные глаза :))
Выполните и напишите ваш результат:
На вкладке Правка в списке Файл открыт следующими пользователями просмотрите имена пользователей.
Да, я Жук, три пары лапок и фасеточные глаза :))
The opinion expressed by me is not an official position of Microsoft
Он открывает файл через устаревшие "Общие книги" размещённую в сети предприятия, но файл у него открывается в режиме "Только для чтения" и он не видит кто из пользователей открыл файл. Для решения этой задачи, он возможно пишет в VBA код выполняющий задачу:
"Если при попытке открыть файл, файл можно открыть только в режиме "Только для чтения", VBA выводит окно "Файл занят пользователем: Имярек", в противном случае открыть файл на редактирование."
Допускаю, что ему необходим "UserName" или его аналог для VBA.
Да, я Жук, три пары лапок и фасеточные глаза :))
Для начала, ответьте на мой вопрос, какой результат получается у вас, после предложенных вам действий.
Да, я Жук, три пары лапок и фасеточные глаза :))
Внимательно изучите статью "Общие книги", ссылку на которую я вам дал ранее. В ней пошагово в девять шагов, написано как создавать и работать с Общей книгой. Также внимательно изучите "Дополнительные сведения".
По вашему скриншоту, файл не является Общей книгой и открыт в монопольном режиме :
Дополните, что у вас имеется уже сейчас, и что может ваш макрос.
В дополнение, если бы вы внимательно прочитали статью и выполнили все рекомендации статьи, ссылку на которую вам дал ранее, то у вас был бы результат отображения всех пользователей открывших книгу на редактирование:
и не нужно было бы создавать макрос, так как Общая книга открывается для редактирования у всех открывающих Общую книгу:
Читайте также: