![](https://technet24.ir/wp-content/uploads/2025/01/learning-how-to-view-and-close-open-files-in-windows-server-smb-share.jpg)
آموزش مشاهده و بستن پرونده های باز در Windows Server SMB Share
مدیران فایل سرور ویندوز اغلب باید فایلهای به اشتراک گذاشته شدهای را که به طور همزمان توسط چندین کاربر باز شدهاند، به طور اجباری ببندند. امروز، بیایید نگاهی به نحوه مشاهده فایلهای باز در سرور ویندوز از دیدگاه مهندسان پشتیبانی بیندازیم و بررسی کنیم که چگونه جلسات فایل را بسته (reset) میکنیم تا فایلهای باز را آزاد کنیم.
مشاهده فایلهای باز در یک پوشه به اشتراکگذاشتهشده در سرور ویندوز
ما میتوانیم فهرستی از فایلهای باز در فایل سرور ویندوز را با استفاده از ابزار گرافیکی داخلی مدیریت کامپیوتر (compmgmt.msc) بدست آوریم. ابتدا کنسول مدیریت کامپیوتر را در فایل سرور باز کرده و به مسیر System Tools -> Shared Folders -> Open files رفته و در سمت راست پنجره، فهرستی از فایلهای باز در سرور SMB فعلی نمایش داده میشود. این فهرست شامل مسیر محلی فایل، نام حساب کاربری که فایل را باز کرده است، تعداد قفلها و روشی است که فایل در آن باز شده است (Read یا Write+Read).
فایلهای باز در سرور ویندوز
ما میتوانیم همان فهرست فایلهای باز را با استفاده از ابزار کنسول openfiles.exe بدست آوریم. برای مثال، با استفاده از دستور زیر میتوانیم شناسه جلسه، نام کاربری و مسیر کامل فایل باز را بدست آوریم:
openfiles /Query /fo csv |more
وقتی یک کاربر به طور ریموت به فایلی در پوشه به اشتراکگذاشتهشده شبکه دسترسی پیدا میکند، یک جلسه جدید SMB ایجاد میشود. ما میتوانیم فایلهای باز را با استفاده از این شناسههای جلسه مدیریت کنیم. ما میتوانیم فهرستی از فایلهای باز در یک سرور ریموت نمایش دهیم. برای مثال، برای فهرست کردن همه فایلهای باز در پوشههای به اشتراکگذاشتهشده روی میزبان lon-fs01 از دستور زیر استفاده میکنیم:
openfiles /Query /s lon-fs01 /fo csv
دستور openfiles همچنین به ما این امکان را میدهد که فهرستی از فایلهای باز محلی را مشاهده کنیم. برای مشاهده آن، گزینه “Maintain Objects List” را با استفاده از دستور زیر فعال کرده و سپس سرور را راهاندازی مجدد میکنیم:
openfiles /local on
توصیه میشود از این حالت فقط برای اهداف اشکالزدایی استفاده کنید، زیرا ممکن است عملکرد سرور را تحت تأثیر منفی قرار دهد.
چگونه بفهمیم که چه کسی فایلی را در یک پوشه به اشتراکگذاشتهشده قفل کرده است؟
برای شناسایی کاربری که فایل filename.docx را در پوشه شبکه به اشتراکگذاشتهشده در سرور ریموت lon-fs01 باز کرده (قفل کرده) است، دستور زیر را اجرا میکنیم:
openfiles /Query /s lon-fs01 /fo csv | find /i “filename.docx”
کلید /i برای جستجوی بدون حساسیت به حروف بزرگ و کوچک است. ما میتوانیم فقط بخشی از نام فایل را مشخص کنیم. برای مثال، اگر بخواهیم بفهمیم که چه کسی فایلی با نام “sale_report” را باز کرده است، از روش زیر به کمک | استفاده میکنیم:
openfiles /Query /s lon-fs01 /fo csv | find /i “sale_report”| find /i “xlsx”
البته، میتوانیم این فایل را در رابط گرافیکی مدیریت کامپیوتر پیدا کنیم، اما این روش کمتر راحت است.
چگونه یک فایل باز را به طور اجباری در اشتراک SMB ببندیم؟
برای بستن یک فایل باز، آن را در فهرست فایلها در بخش ‘Open File’ پیدا کرده و گزینه ‘Close Open File’ را از منوی زمینه انتخاب میکنیم.
فایلهای باز در سرور ویندوز
اگر صدها فایل باز در فایل سرور وجود داشته باشد، پیدا کردن فایل خاص در کنسول راحت نخواهد بود. راحتتر است که از ابزار خط فرمان Openfiles استفاده کنیم. همانطور که قبلاً ذکر شد، این ابزار شناسه جلسه فایل باز را برمیگرداند. با استفاده از این شناسه جلسه، میتوانیم فایل را با ریست کردن ارتباط SMB به طور اجباری ببندیم. اول، باید شناسه جلسه فایل باز را پیدا کنیم:
openfiles /Query /s lon-fs01 /fo csv | find /i “farm”| find /i “.xlsx”
کاربر را با استفاده از شناسه جلسه SMB دریافتی از فایل قطع اتصال میدهیم:
openfiles /Disconnect /s lon-fs01 /ID 617909089
ما میتوانیم تمام جلسات را به طور اجباری ریست کرده و تمام فایلهای باز شده توسط یک کاربر خاص را باز کنیم:
openfiles /disconnect /s lon-fs01/u corp\mjenny /id *
معمولاً بستن اجباری فایلی که توسط یک کلاینت روی سرور SMB باز شده است، ممکن است منجر به از دست رفتن دادههای ذخیرهنشده شود. بنابراین، باید با دقت از دستور openfiles /disconnect یا cmdlet Close-SMBOpenFile استفاده کنیم.
Get-SMBOpenFile: پیدا کردن و بستن فایلهای باز با استفاده از PowerShell
در نسخههای جدید PowerShell برای Windows Server /Windows cmdlet های جدیدی برای مدیریت اشتراکها و فایلها روی سرور SMB معرفی شدهاند. این cmdletها برای بستن اتصالات شبکه به یک فایل باز بهطور ریموت استفاده میشوند. ما میتوانیم فهرستی از فایلهای باز را با استفاده از cmdlet Get-SMBOpenFile بدست آوریم. Close-SmbOpenFile برای بستن/ریست کردن ارتباط با یک فایل ریموت استفاده میشود. برای نمایش فهرستی از فایلهای باز در سرور SMB ویندوز، دستور زیر را اجرا میکنیم:
Get-SmbOpenFile | Format-List
دستور بازمیگرداند شناسه فایل، شناسه جلسه و نام کامل فایل (مسیر). ما میتوانیم فهرستی از فایلهای باز را با نام کاربری و نام کامپیوتر (آدرسهای IP) نمایش دهیم:
Get-SmbOpenFile|select ClientUserName,ClientComputerName,Path,SessioID
ما میتوانیم تمام فایلهای باز شده توسط یک کاربر خاص را فهرست کنیم:
Get-SMBOpenFile –ClientUserName “corp\bob”|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”}
Cmdlet Close-SmbOpenFile برای بستن هندل فایل باز استفاده میشود. شما میتوانید فایل را با شناسه ببندید:
Close-SmbOpenFile -FileId 4123426323239
اما معمولاً راحتتر است که فایل را با نام ببندید:
Get-SmbOpenFile | where {$_.Path –like “*annual2020.xlsx”} | Close-SmbOpenFile -Force
با استفاده از cmdlet Out-GridView، میتوانیم یک فرم ساده GUI برای پیدا کردن و بستن فایلهای باز ایجاد کنیم. اسکریپت زیر فهرستی از فایلهای باز را نشان میدهد. ما باید از فیلترهای داخلی در جدول Out-GridView برای پیدا کردن فایلهای باز که میخواهیم جلسات SMB آنها را ریست کنیم استفاده کنیم. سپس، باید فایلهای مورد نظر را انتخاب کرده و روی OK کلیک کنیم. در نتیجه، فایلهای انتخابشده به طور اجباری بسته خواهند شد.
Get-SmbOpenFile|select ClientUserName,ClientComputerName,Path,SessionID| Out-GridView -PassThru –title “Select Open Files”|Close-SmbOpenFile -Confirm:$false -Verbose
چگونه فایلهای باز را از طریق PowerShell در کامپیوتر ریموت ببندیم؟
حالا بیایید ببینیم که چگونه مهندسان پشتیبانی ما فایلهای باز را در کامپیوتر ریموت با استفاده از PowerShell میبندند. Cmdletهای Get-SMBOpenFile و Close-SmbOpenFile برای پیدا کردن و بستن فایلهای باز (قفل شده) به طور ریموت استفاده میشوند. ابتدا باید به یک سرور SMB ریموت از طریق جلسه CIM متصل شویم:
$sessn = New-CIMSession –Computername lon-fs01
ما همچنین میتوانیم از cmdletهای PSRemoting برای اتصال به سرور ریموت و اجرای دستورات PowerShell استفاده کنیم:
Enter-PSSession یا Invoke-Command.
دستور زیر جلسه SMB برای فایل باز pubs.docx را پیدا کرده و جلسه فایل را میبندد:
Get-SMBOpenFile -CIMSession $sessn | where {$_.Path –like “*pubs.docx”} | Close-SMBOpenFile -CIMSession $sessn
با فشردن Y بستن فایل را تأیید میکنیم. در نتیجه، فایل باز خواهد شد. حالا کاربران دیگر میتوانند آن را باز کنند. برای حذف تأیید بستن اجباری یک فایل روی سرور SMB، از کلید -Force استفاده میکنیم. با استفاده از PowerShell، میتوانیم جلسات SMB را بسته و تمام فایلهایی که یک کاربر خاص باز کرده است را آزاد کنیم. برای مثال، برای ریست کردن تمام جلسات فایل کاربر bob، دستور زیر را اجرا میکنیم:
Get-SMBOpenFile -CIMSession $sessn | where {$_.ClientUserName –like “bob”}|Close-SMBOpenFile -CIMSession $sessn