Quản lý xử lý File bị khóa bằng PowerShell


Một trong những lỗi khó chịu hơn mà người dùng hoặc quản trị viên CNTT có thể mắc phải là lỗi tệp file bị khóa trong Windows. Khi bạn xóa một thư mục, di chuyển tệp hoặc chỉnh sửa cấu hình và bạn gặp phải thông báo lỗi tệp file bị khóa, nó sẽ tốt hơn để xử lý nhanh chóng và hiệu quả.

Microsoft đã giới thiệu PowerShell như một phương án thay thế, nhưng nó có nhiều chức năng hơn thế và là một ngôn ngữ phức tạp và có khả năng. Hãy cùng xem trong bài viết này về cách bạn có thể sử dụng PowerShell để xử lý các tệp bị khóa bằng Powershell.

Quản lý xử lý File bị khóa bằng PowerShell

Sự cố tệp bị khóa

Làm thế nào biết chính xác một tập tin bị khóa? Trong quá trình sử dụng bình thường, một quy trình tạo ra nhiều tay cầm cho các tài nguyên như tệp. Bằng cách đó, các quy trình thường khóa tệp để ngăn thay đổi cấu hình ngoài ý muốn hoặc tham nhũng khác xảy ra. Vấn đề thường là rất khó xác định quá trình nào đã khóa tệp và sau đó, làm thế nào để loại bỏ khóa đó khỏi tệp.

Thật không may, không có lệnh ghép ngắn tích hợp để kiểm tra một tệp và cho biết liệu nó có bị khóa hay do quá trình nào. Do đó, bạn cần tạo các chức năng của riêng mình hoặc bọc các công cụ hữu ích khác tồn tại để hỗ trợ tìm hiểu thêm về các tệp này.

Kiểm tra các tệp bị khóa

Trong Windows, bạn có thể kiểm tra xem một tệp riêng lẻ có bị khóa hay không. Sử dụng khối mã sau đây, bạn có thể kiểm tra xem một tệp đã cho có bị khóa hay không. Biến $ Item cần được đặt thành đường dẫn tệp đầy đủ. Bằng cách thử nghiệm để xem liệu tệp có thể được mở để ghi hay không, như đã thấy với lệnh [System.IO.File]::Open ($ Item, ‘Open’, ‘Write’), bạn có thể biết liệu tệp có bị khóa hay không.

If ([System.IO.File]::Exists($Item)) {
  Try {
      $FileStream = [System.IO.File]::Open($Item,'Open','Write')

      $FileStream.Close()
      $FileStream.Dispose()

      $IsLocked = $False
  } Catch [System.UnauthorizedAccessException] {
      $IsLocked = 'AccessDenied'
  } Catch {
      $IsLocked = $True
  }
}

Get-SMBOpenFile

Tôi đã nói rằng Windows không có chức năng tích hợp sẵn, nhưng có một trường hợp tồn tại một chức năng. Nếu bạn có chia sẻ từ xa hoặc thậm chí chia sẻ quản trị (chẳng hạn như c $), thì bạn có thể sử dụng lệnh ghép ngắn Get-SMBOpenFile để báo cáo về các tệp đang mở đó.

PS C:\> Get-SMBOpenFile

FileId       SessionId    Path  ShareRelativePath
------       ---------    ----  -----------------
154618822665 154618822657 C:\

PS C:\> 

Nhược điểm là điều này chỉ hoạt động đối với các tệp được truy cập từ xa. Bất kỳ tệp bị khóa nào đang được sử dụng trên hệ thống cục bộ của bạn sẽ được báo cáo, vì vậy trong hầu hết các trường hợp, đây không phải là giải pháp khả thi. Để đóng, bạn có thể dẫn các tệp đang mở được trả về lệnh Đóng-SMBOpenFile.

Get-SMBOpenFile | Close-SMBOpenFile

Tiện ích OpenFiles

Windows có một tiện ích tích hợp có tên openfiles có thể giúp liệt kê những tập tin nào đang được sử dụng và ngắt kết nối chúng. Thoạt nhìn, nó có vẻ hoàn hảo cho nhu cầu của bạn! Bạn thậm chí có thể bọc cái này trong một hàm PowerShell để dễ dàng truy vấn và ngắt kết nối các tệp.

Mở một dấu nhắc quản trị PowerShell và chạy lệnh openfiles / query. Ngay lập tức, bạn sẽ nhận được một thông báo lỗi cho biết rằng các đối tượng duy trì danh sách các cờ toàn cầu của Wap cần được bật.

PS C:/> openfiles /query

INFO: The system global flag 'maintain objects list' needs
      to be enabled to see local opened files.
      See Openfiles /? for more information.


Files opened remotely via local share points:
---------------------------------------------

INFO: No shared open files found.

Danh sách các đối tượng này là những gì thực sự duy trì danh sách các thẻ điều khiển đang sử dụng và cho phép các tệp mở truy vấn thông tin đó. Để bật tính năng này, hãy nhập openfiles / local và sau đó khởi động lại máy tính của bạn. Nhược điểm của việc bật tính năng này là có một điểm nhấn hiệu suất nhẹ, tùy thuộc vào hệ thống của bạn, có thể không xứng đáng với tiện ích sử dụng công cụ này. Điều đó đang được nói, hãy để Lặn xem cách chúng ta có thể làm cho công việc này hoạt động trong PowerShell.

PS C:\> openfiles /Query /fo csv /nh

Files opened remotely via local share points:
---------------------------------------------
"ID","Accessed By","Type","Open File (Path\executable)"
"608","user","Windows","C:\"

PS C:\> openfiles /Query /fo csv | Select-Object -Skip 4 | ConvertFrom-CSV

ID  Accessed By  Type    Open File (Path\executable)
--  -----------  ----    ---------------------------
608 user         Windows C:\

PS C:\> openfiles /disconnect /id 608

SUCCESS: The connection to the open file "C:\" has been terminated.

Với các ví dụ trước, bạn có thể xem cách nhập đầu ra CSV của các tệp mở vào PowerShell. Sử dụng thông tin đó, sau đó bạn có thể ngắt kết nối một tệp để mở khóa. Do hiệu suất đạt được mà bạn có thể phải chịu khi cho phép khả năng duy trì danh sách đối tượng, nó có thể không đáng giá cho nhu cầu của bạn. Do đó, các giải pháp khác có thể cần thiết.

Ứng dụng Xử lý

Sysiternals được biết đến với nhiều công cụ CNTT hữu ích và gần như thiết yếu mà họ tạo ra. Cách đây một thời gian, Sysiternals đã được Microsoft mua lại và bạn có thể tải xuống và sử dụng các công cụ được hỗ trợ tốt này cho chính mình. Thuận tiện, có một ứng dụng tên là tay cầm cung cấp chính xác những gì bạn đang tìm kiếm!

Trước tiên, bạn cần tải xuống ứng dụng, giải nén các tệp và đặt các tệp thực thi vào vị trí mà biến môi trường Đường dẫn của bạn đã bao gồm. Bằng cách làm như vậy, bạn có thể dễ dàng tham khảo ứng dụng bất cứ nơi nào bạn cần. Sử dụng một truy vấn đơn giản cho các tệp đang mở, bạn có thể thấy rằng bạn nhận được rất nhiều kết quả (được cắt bớt để dễ đọc).

PS C:/> handle64 -NoBanner
...
------------------------------------------------------------------------------
RuntimeBroker.exe pid: 9860 User
   48: File          C:\Windows\System32
  188: Section       \BaseNamedObjects\__ComCatalogCache__
  1EC: Section       \BaseNamedObjects\__ComCatalogCache__
------------------------------------------------------------------------------
chrome.exe pid: 4628 User
   78: File          C:\Program Files (x86)\Google\Chrome\Application\78.0.3904.108
  1C4: Section       \Sessions\1\BaseNamedObjects\windows_shell_global_counters
...

Bạn dường như có được những gì bạn muốn, ít nhất là một cách để tìm ra những tập tin nào đang được sử dụng và bạn có thể kiểm tra chúng bằng cách sử dụng mã bị khóa từ trước đó. Nhưng làm thế nào để bạn làm điều này dễ sử dụng hơn? Đoạn mã sau đọc từng tiến trình và chỉ lấy các tệp bị khóa. Nhược điểm là điều này mất một thời gian để chạy vì có nhiều quy trình.

$Processes = Get-Process

$results = $Processes | Foreach-Object {
    $handles = (handle64 -p $_.ID -NoBanner) | Where-Object { $_ -Match " File " } | Foreach-Object {
            [PSCustomObject]@{
        "Hex"  = ((($_ -Split " ").Where({ $_ -NE "" })[0]).Split(":")[0]).Trim()
        "File" = (($_ -Split " ")[-1]).Trim()
        }
    }

    If ( $handles ) {
        [PSCustomObject]@{
            "Name"    = $_.Name
            "PID"     = $_.ID
            "Handles" = $handles
        }
    }
}

Cuối cùng, những gì bạn nhận được là một tập hợp các tệp có thể thao tác, được liệt kê theo quy trình, mà bạn biết đang sử dụng và có thể được lọc thêm. Nếu bạn phát hiện ra rằng bạn cần phải đóng một trong số họ, bạn có thể thực hiện các thao tác sau (với tư cách Quản trị viên):

PS C:\> $results |
>>  Where-Object Name -EQ 'Notepad' |
>>  Where-Object { $_.Handles.File -Match "test.txt" }

Name                      PID Handles
----                      --- -------
Notepad                   12028 {@{Hex=44; File=C:\test.txt}


PS C:\> handle64 -p 12028 -c 44 -y -nobanner

44: File  (R-D)   C:\test.txt

Handle closed.

Bạn có thể bọc tất cả những thứ này trong một hàm để làm cho việc phân tích và tìm kiếm dễ dàng hơn nữa khi cần thiết. Khả năng TMany tồn tại, đặc biệt là kết hợp các phương pháp khác nhau thành một giải pháp phù hợp với môi trường của bạn.

Phần kết luận

Xử lý các tệp bị khóa có thể là một thách thức, đặc biệt là khi nó dừng những gì bạn cần hoàn thành nhanh chóng. Có một số cách để tìm và mở khóa các tệp file bị khóa đó, nhưng nó đòi hỏi một chút công việc vì Windows không có phương pháp tích hợp thực sự toàn diện để xử lý các tệp file bị khóa đó. Các giải pháp được phác thảo sẽ giúp giải quyết vấn đề có thể xảy ra trong thời gian ngắn và cho phép bạn chuyển sang các nhiệm vụ quan trọng hơn nhiều!

Xem thêm :Tại Đây
Blog Download Template Blogspot : Tại Đây
Blog Download Phần Mềm Free : Tại Đây
Blog Download Acapella : Tại Đây
Trang mã hóa URL : Tại Đây


Welcome to F4vnn.com - Blog Thủ Thuật, tất cả nội dung trên website được chúng tôi sưu tập trên Internet. Nếu có vấn đề về bản quyền với bài viết trên Blog vui lòng liên hệ với và chúng tôi sẽ xóa bài viết ngay lập tức . Liên lạc với Admin qua mail: hoangvansy90@gmail.com!

ĐỪNG QUÊN ĐĂNG KÝ FANPAGE ĐỂ NHẬN THỦ THUẬT MỚI NHẤT NHÉ!