Computer >> 컴퓨터 >  >> 시스템 >> Windows Server

Windows Server SMB 공유 폴더에서 열린 파일 조회 및 강제 닫기 완벽 가이드

Windows 파일 서버 관리자라면 여러 사용자가 동시에 열어놓은 공유 파일을 강제로 닫아야 하는 상황에 자주 직면하게 됩니다. 데스크톱 프로그램이 비정상적으로 작동하거나, 사용자가 로그오프를 제대로 하지 않았거나, 파일을 열어둔 채 퇴근·휴가를 떠나는 경우가 대표적입니다. 이럴 때 공유 네트워크 폴더의 파일은 계속 열려 있는(잠긴) 상태가 되어 다른 사용자가 수정할 수 없습니다.

잠긴 파일을 열려고 하면 사용 중인 응용 프로그램에 따라 다음과 같은 메시지가 나타납니다.

filename 문서는 다른 사용자가 편집 중이므로 잠겨 있습니다. 이 문서의 읽기 전용 복사본을 열려면…

이 글에서는 Windows 파일 서버에서 열려 있는 파일 목록을 확인하는 방법, 공유 폴더에서 특정 파일을 잠근 사용자를 찾는 방법, 그리고 파일 세션을 종료해 잠긴 파일을 해제하는 방법까지 단계별로 살펴보겠습니다.

Windows Server에서 공유 폴더의 열린 파일 확인하기

Windows 파일 서버에서 사용자가 연 파일 목록은 기본 제공되는 컴퓨터 관리(Computer Management) 스냅인(compmgmt.msc)으로 손쉽게 확인할 수 있습니다.

파일 서버에서 컴퓨터 관리 콘솔을 실행하거나, 자신의 PC에서 원격으로 서버에 연결한 뒤 시스템 도구 → 공유 폴더 → 열린 파일로 이동합니다. 창 오른쪽에 현재 SMB 서버에서 열려 있는 파일 목록이 표시됩니다. 각 항목에는 파일의 로컬 경로, 파일을 연 사용자 계정 이름, 잠금 수, 그리고 파일이 열린 모드(읽기 또는 읽기+쓰기)가 함께 표시됩니다.

Windows Server SMB 공유 폴더에서 열린 파일 조회 및 강제 닫기 완벽 가이드

동일한 목록은 기본 제공 콘솔 도구인 openfiles.exe로도 확인할 수 있습니다. 예를 들어 아래 명령을 실행하면 세션 ID, 사용자 이름, 열린 파일의 전체 로컬 경로를 얻을 수 있습니다.

openfiles /Query /fo csv |more

Windows Server SMB 공유 폴더에서 열린 파일 조회 및 강제 닫기 완벽 가이드

사용자가 서버의 공유 네트워크 폴더에 있는 폴더나 파일에 원격으로 접근하면 새로운 SMB 세션이 생성됩니다. 이 세션 ID를 통해 열린 파일을 관리할 수 있습니다.

원격 서버의 열린 파일 목록도 조회할 수 있습니다. 예를 들어 lon-fs01 호스트의 공유 폴더에서 열린 모든 파일을 나열하려면 다음과 같이 입력합니다.

openfiles /Query /s lon-fs01 /fo csv

openfiles 명령은 로컬에서 열린 파일 목록도 볼 수 있습니다. 다만 먼저 openfiles /local on 명령으로 "개체 목록 유지(Maintain Objects List)" 옵션을 활성화하고 서버를 재부팅해야 합니다. 이후 openfiles 명령이 로컬 프로세스가 연 파일도 함께 표시합니다. 단, 이 모드는 서버 성능에 부정적인 영향을 줄 수 있으므로 디버깅 용도로만 사용하는 것이 좋습니다.

공유 폴더에서 파일을 잠그고 있는 사용자 찾기

원격 서버 lon-fs01의 공유 네트워크 폴더에서 filename.docx 파일을 열어(잠근) 사용자를 확인하려면 다음 명령을 실행합니다.

openfiles /Query /s lon-fs01 /fo csv | find /i "filename.docx"

/i 옵션은 대소문자를 구분하지 않고 파일을 검색할 때 사용합니다.

파일 이름의 일부만 지정해 검색할 수도 있습니다. 예를 들어 이름에 "sale_report"가 포함된 XLSX 파일을 누가 열었는지 알고 싶다면 다음과 같이 파이프(|)를 활용합니다.

openfiles /Query /s lon-fs01 /fo csv | find /i "sale_report"| find /i "xlsx"

물론 컴퓨터 관리 GUI에서 해당 파일을 찾을 수도 있지만, 검색 기능이 없어 불편하기 때문에 명령줄 방식이 더 효율적입니다.

SMB 공유에서 열린 파일 강제로 닫기

열린 파일을 닫으려면 컴퓨터 관리의 열린 파일 섹션에서 대상 파일을 찾은 뒤, 마우스 오른쪽 버튼 클릭 후 열린 파일 닫기(Close Open File)를 선택하면 됩니다.

Windows Server SMB 공유 폴더에서 열린 파일 조회 및 강제 닫기 완벽 가이드

그러나 파일 서버에 수백 개의 열린 파일이 있다면 콘솔에서 특정 파일을 찾기가 쉽지 않습니다. 이럴 때는 Openfiles 명령줄 도구를 사용하는 편이 좋습니다. 앞서 설명했듯이 이 도구는 열린 파일의 세션 ID를 반환하며, 이 세션 ID를 이용해 SMB 연결을 초기화하여 파일을 강제로 닫을 수 있습니다.

먼저 열린 파일의 세션 ID를 찾습니다.

openfiles /Query /s lon-fs01 /fo csv | find /i "farm"| find /i ".xlsx"

확인된 SMB 세션 ID를 사용해 사용자와 파일의 연결을 끊습니다.

openfiles /Disconnect /s lon-fs01 /ID 617909089

Windows Server SMB 공유 폴더에서 열린 파일 조회 및 강제 닫기 완벽 가이드

특정 사용자가 연 모든 세션을 강제로 초기화하고 해당 사용자가 연 모든 파일의 잠금을 해제할 수도 있습니다.

openfiles /disconnect /s lon-fs01/u corp\mjenny /id *

주의: SMB 서버에서 클라이언트가 연 파일을 강제로 닫으면 저장되지 않은 데이터가 손실될 수 있습니다. 따라서 openfiles /disconnect 명령이나 Close-SMBOpenFile cmdlet(아래에서 설명)은 신중하게 사용해야 합니다.

PowerShell의 Get-SMBOpenFile로 열린 파일 핸들 찾기 및 닫기

Windows Server 2012/Windows 8용 PowerShell부터 SMB 서버의 공유 및 파일을 관리하는 새로운 cmdlet이 추가되었습니다. 이 cmdlet들을 사용하면 열린 파일에 대한 네트워크 연결을 원격으로 종료할 수 있습니다.

열린 파일 목록은 Get-SMBOpenFile cmdlet으로 조회하고, 원격 파일에 대한 연결 종료(초기화)에는 Close-SmbOpenFile을 사용합니다.

Windows SMB 서버에서 열린 파일 목록을 표시하려면 다음 명령을 실행합니다.

Get-SMBOpenFile

Windows Server SMB 공유 폴더에서 열린 파일 조회 및 강제 닫기 완벽 가이드

이 명령은 파일 ID, 세션 ID, 전체 파일 이름(경로)을 반환합니다.
사용자 이름과 컴퓨터 이름(IP 주소)을 포함한 열린 파일 목록을 보려면 다음과 같이 입력합니다.

Get-SmbOpenFile|select ClientUserName,ClientComputerName,Path,SessionID

Windows Server SMB 공유 폴더에서 열린 파일 조회 및 강제 닫기 완벽 가이드

특정 사용자가 연 모든 파일을 나열할 수도 있습니다.

Get-SMBOpenFile –ClientUserName "corp\mjenny"|select ClientComputerName,Path

특정 컴퓨터/서버에서 연 파일만 보려면 다음을 사용합니다.

Get-SMBOpenFile –ClientComputerName 192.168.1.190| select ClientUserName,Path

패턴으로 열린 파일 목록을 필터링할 수도 있습니다. 예를 들어 공유 폴더에서 열린 모든 exe 파일을 나열하려면 다음과 같이 합니다.

Get-SmbOpenFile | Where-Object {$_.Path -Like "*.exe*"}

특정 이름이 포함된 열린 파일을 찾으려면 다음을 사용합니다.

Get-SmbOpenFile | Where-Object {$_.Path -Like "*reports*"}

열린 파일 핸들을 닫을 때는 Close-SmbOpenFile cmdlet을 사용합니다. 파일 ID로 닫을 수 있습니다.

Close-SmbOpenFile -FileId 4123426323239

하지만 일반적으로는 파일 이름으로 닫는 것이 더 편리합니다.

Get-SmbOpenFile | where {$_.Path –like "*annual2020.xlsx"} | Close-SmbOpenFile -Force

Out-GridView cmdlet을 활용하면 열린 파일을 찾아 닫는 간단한 GUI 폼을 만들 수도 있습니다. 아래 스크립트는 열린 파일 목록을 표시합니다. Out-GridView 테이블의 기본 제공 필터를 사용해 SMB 세션을 초기화할 파일을 찾고, 대상 파일을 선택한 뒤 OK를 클릭하면 선택된 파일들이 강제로 닫힙니다.

Get-SmbOpenFile|select ClientUserName,ClientComputerName,Path,SessionID| Out-GridView -PassThru –title "Select Open Files"|Close-SmbOpenFile -Confirm:$false -Verbose

Windows Server SMB 공유 폴더에서 열린 파일 조회 및 강제 닫기 완벽 가이드

PowerShell로 원격 컴퓨터의 열린 파일 닫기

Get-SMBOpenFileClose-SmbOpenFile cmdlet은 원격으로 열린(잠긴) 파일을 찾아 닫는 데에도 사용할 수 있습니다. 먼저 CIM 세션을 통해 원격 Windows SMB 서버에 연결해야 합니다.

$sessn = New-CIMSession –Computername lon-fs01

PSRemoting cmdlet인 Enter-PSSession 또는 Invoke-Command를 사용해 원격 서버에 연결하여 PowerShell 명령을 실행할 수도 있습니다.

다음 명령은 열린 파일 pubs.docx의 SMB 세션을 찾아 해당 파일 세션을 종료합니다.

Get-SMBOpenFile -CIMSession $sessn | where {$_.Path –like "*pubs.docx"} | Close-SMBOpenFile -CIMSession $sessn

파일 닫기를 확인하는 메시지가 표시되면 Y를 누릅니다. 그러면 파일 잠금이 해제되어 다른 사용자가 파일을 열 수 있게 됩니다.

Windows Server SMB 공유 폴더에서 열린 파일 조회 및 강제 닫기 완벽 가이드

SMB 서버에서 파일을 강제로 닫을 때 확인 절차를 생략하려면 -Force 옵션을 사용하세요.

PowerShell을 활용하면 특정 사용자가 연 모든 SMB 세션을 종료하고 파일 잠금을 한 번에 해제할 수도 있습니다(사용자가 퇴근하면서 파일을 닫지 않고 간 경우 등). 예를 들어 사용자 mjenny의 모든 파일 세션을 초기화하려면 다음 명령을 실행합니다.

Get-SMBOpenFile -CIMSession $sessn | where {$_.ClientUserName –like "*mjenny*"}|Close-SMBOpenFile -CIMSession $sessn