2015年8月7日 星期五

Wireshark - 如何在截取的封包中自動進行IP反查

        相信大家都對Wireshark都不陌生,但在分析的過程中,我們有時候希望可以針對截取到的IP進行反追蹤,如透過WHOIS的網站進行反查詢,今天我們來介紹如何透過GeoIP的資料庫,讓截取到的封包也能自動的顯示IP資訊。

MaxMind推出GeoIP的服務,可以透過Web Service或是程式的方式進行,但是由於需要額外的付費,所以我們可以透過下載簡易資料集進行,下列是下載的網址,資料集主要分成City、Country、ASN(IP所屬國)三種類型,此簡易資料集並非完整對應到所有的資訊,所以大家可以嘗試看看,如有進一步的需求,可以購買他們的產品,資訊會更完整。

公司介紹:https://www.maxmind.com/en/home?pkit_lang=en
GeoIP產品介紹:http://dev.maxmind.com/geoip/
資料下載:http://dev.maxmind.com/geoip/legacy/geolite/

GeoLite Legacy Downloadable Databases
CityData: http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
CountryData:http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
ASNData:http://download.maxmind.com/download/geoip/database/asnum/GeoIPASNum.dat.gz

相關授權與說明:
https://www.maxmind.com/en/geoip2-databases


安裝說明

1、如果你的Wireshark版本太舊時,會無法支援,請先檢查Wireshark是否支援GeoIP,如果太舊時,請重新至Wireshark官網進行下載。

       1-1 開啟Wireshark後,點選Help -> About Wireshark



2、請先在下列的位置上建立資料夾。

C:\Program Files\Wireshark\etc\GeoLite

3、請先分別下載下列的三個資料集,到上述的位置中。

CityData: http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
CountryData:http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
ASNData:http://download.maxmind.com/download/geoip/database/asnum/GeoIPASNum.dat.gz


4、下載後請分別將下載的檔案解壓縮後統一放置在GeoLite的目錄下,如下列所示。



5、開啟Wireshark -> Edit -> Preferences ->Name Resolution -> GeoIP database directories -> Edit


6、請將資料庫的位置指定到步驟一的資料夾位置,如下圖所示。


7、設定完成後,請先關閉並重新啟動Wireshark。

8、再次開啟時,你可以嘗試收集如開啟一個網站或Ping某一個Domain Name,然後再進行停止,如下列的圖示即可秀出IP的進階資訊。


9、如果你想要停用此功能的話,你可以透過下列的方式進行停用(啟用)。


透過上述的介紹,我們可以在分析封包的過程中同時進行IP的解析,相信對大家有小小的幫助,後續我會再同時收集Wireshark的案例再與大家分享。

關鍵字:Wireshark、GeoIP

2015年7月10日 星期五

網路安全防護 - 公開Wifi的危險性

        免費通常都是最貴的,這句話一直廣為流傳,在路上我們常常可以看到免費的Wifi,但是其實都有潛藏著一定的危機(其實我也滿常使用),所以本篇我就實際來架一個免費的Wifi並透過Wireshark來側錄並分析說明。

為了完整收集並可以透過Wireshark進行側錄,所以我先將我無線網路透過 "Virtual Router"的軟體進行公開分享,也就是當成分享熱點使用,然後再讓其他使用者連線,此套軟體使用後,說實在真的簡單又好用,只需設定SSID與密碼,再點選啟動,其他的使用者即可透過此台分享的無線進行連線,非常的方便。



Virtual Router - Wifi Hot Spot for Windows 8, Windows 7 and 2008 R2:
https://virtualrouter.codeplex.com/


啟動此軟體後,我們即可透過Wireshark在熱點的電腦上進行所有封包的 "收集",在此案例中,我透過平版電腦連接到此公開的Wifi進行上網,並透過Telnet的方式連線到PTT(批踢踢)進行瀏覽,在這邊主要會透過Telnet進行瀏覽也是因為一般常見的如Telnet、HTTP等協定,在進行傳輸都是不加密的,所以當你在傳輸的過程中被攔截到時,傳輸的資料就會一覽無遺,所以大家如果在不得已使用公開的Wifi時,也儘量注意在傳輸機敏資料時,使用的協定為何。

Wireshark Download:
https://www.wireshark.org/download.html

捉好封包後,可能封包檔案會比較大,但由於我們已有特定的目標,所以可以針對未加密的封包進行過濾,所以我們在打開封包後,可以直接在過濾視窗上輸入Telnet進行過濾。


過濾後,你會發現封包已少掉非常多,我們希望可以找出登入到PTT的帳號密碼,由於資訊是從Client端傳送到Server端,所以我們可以再過濾資料,條件更改如下。




再次過濾後,很幸運的,你就會發現我們找到我們的目標,也就是我登入的帳號(圖一)與密碼(圖二),以此類推,你要找出HTTP的資料也可以利用上述的方式來進行,相信透過上述的方式,大家可以再深入的了解其重要性,也希望大家可以再注意公開熱點的使用。


關鍵字:SnifferWiresharkVirtual RouterWifi Hot Spot

2015年7月3日 星期五

使用SQL Nexus進行SQL Server完整效能資訊收集與分析

        所謂工欲善其事、必先利其器,當系統發生問題時,如何完整的收集系統問題,並且可以將資料提供給其他的專家進行分析,其實當微軟的SQL Server專家在進行資訊收集時也會透過此工具進行,並進行分析,所以 "非常強烈" 的建議大家使用此工具進行,一來可以盡可能的收集完整的資訊於問題發生的過程中,二來又可以進行自動分析,而且此軟體完全免費,所以此篇我們就來詳細的介紹如何進行。

工具下載:
SQL Nexus Tool
http://sqlnexus.codeplex.com/releases/view/119562

下載後,你會發現有二個主要的資料夾,分別是 DataCollectors 與 SqlNexus4.0.0.64兩個資料夾,DataCollectors主要進行收集,而SqlNexus則是進行資料分析用,首先我們就先進行資料收集的動作。

收集主機資訊:
主機名稱:SQL2012-MAIN
版本:SQL Server 2012
是否為Cluster:否

資料收集:
在DataCollectors目錄中有從SQL 2005 ~ 2014中各個版本的收集腳本,由於我們目前要收集的版本為SQL Server 2012,所以我們先將DataCollectors目錄中的PerfStatsScript2012.zip的壓縮檔解壓縮並放置到SQL Server主機上,然後開啟一個DOS視窗後, 輸入 "StartSQLDiagTrace2012.cmd" 後即可進行收集,如下圖所示。

重點提示:
1、路徑中不要包含有中文名稱。
2、路徑最好不要過長。
3、收集的過程中會稍為的影響系統的運作,可能約5~10%左右,所以進行時請特別注意。
4、收集時最好在問題發生的區段間進行,且最好收集30分鐘。
5、收集完成後,會將檔案輸出在相同目錄中名為 "SQLDiagOutput" 的資料夾。
6、如果要進行結束時,請直接按Ctrl + C即可進行結束。


資料分析:
在使用SQLNexus的程式進行分析前,請先安裝並確認下列的項目是否符合。

先行需求項目:
1、.NET framework 4.0 is required.
2、If you are on SQL 2008 or 2008 R2, you must install report viewer control 2010. If you are on SQL Server 2012, you can skip this step
3、You must install a ReportViewer.exe hotfix. Otherwise, drill-through link won't work.
4、You must install RML Utilities.

接下來我們要將收集到的資料匯入到資料庫後,並透過SQL Nexus進行分析,首先我們先進入SqlNexus的目錄中,然後請一定要以 "Run as Administrator" 的方式啟動sqlnexus.exe的程式

啟動程式後,需選擇你的資料要匯入到那一台的資料庫上,匯入的資料庫與收集的資料庫可以是不同台。

如果你遇到下列的錯誤訊息時,代表你沒有安裝RML Utilities.的套件,請再執行一次並重啟程式。

錯誤訊息:
[sqlnexus.fmNexus.fmNexus.Load] Unable to locate readtrace. Nexus wan't be able to load or analyze profiler trace data.


程式啟動後,請選選擇右上角要匯入的資料庫名稱,預設為 "sqlnexus" ,由於匯入後會進行覆寫,所以請選擇一個資料庫進行匯入,然後再選擇 "Import" 進行匯入。


匯入完成後即會如同下列的畫面。

匯入後,請選擇左上角的 "SQL Perf Main" ,即可發現此工具已完成資料剖析的動作,接下來我們來逐一看看所有的功能。

第一個 "ReadTrace Reports" 此報表會顯示收集的區間中SQL語法執行的活動量。


再點選 "Unique Batches" 後,你可以看到主要有四個區塊,分別是CPU、執行時間、讀取、寫入的統計,而下方也可以看到分別是排行的SQL語法。

Blocking and Resource Wait Statistics的分析。

SQL Server瓶頸分析

其中我覺得非常好用的是此程式可以幫你找出Missing Indexes的部份,並且直接的幫你產生語法,你只需要將語法貼到SQL Server上,即可立即產生相對應的語法。

最後在匯入的過程中可能會有某個檔案造成匯入失敗,你可以將此檔案先行移走,即可匯入完成,此時這個檔案你就必須透過人工的方式進行分析,我將重要的檔案說明整理如下,再請參考。

檔案介紹:
1、SQL Server Log、系統資訊、效能收集
xxx__sp_sqldiag_Shutdown.OUT
xxx__SQL_2012_Perf_Stats_Snapshot_Shutdown.OUT
xxx__SQL_2012_Perf_Stats_Snapshot_Startup.OUT
xxx__SQL_2012_Perf_Stats_Startup.OUT

2、事件檢示記錄
xxx_application_Shutdown.CSV
xxx_security_Shutdown.CSV
xxx_system_Shutdown.CSV

3、SQL語法收集
xxx_SQLDIAG__sp_trace.trc
xxx_SQLDIAG__sp_trace_blk.trc

4、OS系統效能收集
SQLDIAG.BLG

5、程式收集過程記錄
Internal -> ##console.log  

上述中xxx代表你的主機名稱

關鍵字:SQL ServerSQL NexusData CollectorPerformance Tuning

2015年6月28日 星期日

SQL Server 2014 In-Memory OLTP測試與使用心得

在SQL Server 2014的所有新功能中,最被官方與大家所注視的,就是In-Memory的功能,本篇我們就來介紹此新功能,並將個人的使用心得與搜集到的資訊整理出來,也歡迎大家一定討論與分享。

一開始我們先來簡單的說明何謂In-Memory,一般來說資料庫的資料皆存在磁碟上,來要進行存取時,再透過SQL語法進行處理,並將資料撈取至記憶體中,再進行顯示或處理,在以往如果要加快處理,所以就有許多的軟體或硬體的搭配進而推出RAM-Disk的機制,雖然可以加快處理,但最大的問題是,如果遇到突然斷電時,會造成資料的損失,所以大部份的使用者只敢架構在TempDB的部份。而此次SQL Server整合了此功能(In-Memory),即可解決此問題又可以達到加速處理的效果。

接下來我們就來建立範例並初步看整體In-Memory的運作情況,下列的範例是來自MSDN官網。

1、建立資料庫
CREATE DATABASE imoltp
ON PRIMARY (name = [imoltp_data], filename = 'c:\data\imoltp_mod1.mdf', size=500MB)
LOG ON (name = [imoltp_log], filename='C:\data\imoltp_log.ldf', size=500MB)
GO

ALTER DATABASE imoltp ADD FILEGROUP [imoltp_mod] CONTAINS MEMORY_OPTIMIZED_DATA
ALTER DATABASE imoltp ADD FILE (name = [imoltp_dir], filename= 'c:\data\imoltp_dir') TO FILEGROUP imoltp_mod;
GO

上述中我們特別建立了一個FileGroup(imoltp_mod)進行儲存,藉以存放Transaction Log與暫存檔,如下圖所示。

2、建立資料表與新的原生編譯的預存程序
USE imoltp;
GO

IF EXISTS (SELECT NAME FROM sys.objects  WHERE NAME = 'xx')
   DROP PROCEDURE xx
GO

IF EXISTS (SELECT NAME FROM sys.objects WHERE NAME = 'sql')
   DROP TABLE sql
GO

IF EXISTS (SELECT NAME FROM sys.objects WHERE NAME = 'hash')
   DROP TABLE hash
GO

IF EXISTS (SELECT NAME FROM sys.objects  WHERE NAME = 'hash1')
   DROP TABLE hash1
GO


CREATE TABLE [dbo].[sql] (
  c1 INT NOT NULL PRIMARY KEY,
  c2 NCHAR(48) NOT NULL
)
GO

CREATE TABLE [dbo].[hash] (
  c1 INT NOT NULL PRIMARY KEY NONCLUSTERED HASH WITH (BUCKET_COUNT=1000000),
  c2 NCHAR(48) NOT NULL
) WITH (MEMORY_OPTIMIZED=ON, DURABILITY = SCHEMA_AND_DATA);
GO

CREATE TABLE [dbo].[hash1] (
  c1 INT NOT NULL PRIMARY KEY NONCLUSTERED HASH WITH (BUCKET_COUNT=1000000),
  c2 NCHAR(48) NOT NULL
) WITH (MEMORY_OPTIMIZED=ON, DURABILITY = SCHEMA_AND_DATA);
GO

CREATE PROCEDURE xx
  @rowcount INT,
  @c NCHAR(48)
  WITH NATIVE_COMPILATION, SCHEMABINDING, EXECUTE AS OWNER
  AS
  BEGIN ATOMIC
  WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english')
  DECLARE @i INT = 1;

  WHILE @i <= @rowcount
  BEGIN;
    INSERT INTO [dbo].[hash1] VALUES (@i, @c);
    SET @i += 1;
  END;
END;
GO


原生編譯的預存程序與傳統的預存程序差別在於原生的預存程序是建立的當下即進行編譯,而傳統的即是在第一次才進行,而且即載入記憶體中,所以可以快速的重覆執行,但原生的預存程序無法進行修改,進行修改時會得到下列的錯誤訊息。

Msg 10794, Level 16, State 25, Procedure xx, Line 52
The operation 'ALTER PROCEDURE' is not supported with natively compiled stored procedures.

3、測試執行差異
SET STATISTICS TIME OFF;
SET NOCOUNT ON;

-- inserts - 1 at a time

DECLARE @starttime datetime2 = sysdatetime();
DECLARE @timems INT;
DECLARE @i INT = 1
DECLARE @rowcount INT = 100000
DECLARE @c NCHAR(48) = N'12345678901234567890123456789012345678'

--- disk-based table and interpreted Transact-SQL

BEGIN TRAN;
  WHILE @I <= @rowcount
  BEGIN
    INSERT INTO [dbo].[sql] VALUES (@i, @c)
    SET @i += 1
  END;
COMMIT;

SET @timems = datediff(ms, @starttime, sysdatetime());
SELECT 'Disk-based table and interpreted Transact-SQL: ' + CAST(@timems AS VARCHAR(10)) + ' ms';

--- Interop Hash
SET @i = 1;
SET @starttime = sysdatetime();

BEGIN TRAN
  WHILE @i <= @rowcount
    BEGIN
      INSERT INTO [dbo].[hash] VALUES (@i, @c);
      SET @i += 1;
    END;
COMMIT;


SET @timems = datediff(ms, @starttime, sysdatetime());
SELECT ' memory-optimized table w/ hash index and interpreted Transact-SQL: ' + CAST(@timems as VARCHAR(10)) + ' ms';

--- Compiled Hash
SET @starttime = sysdatetime();

EXEC xx @rowcount, @c;

SET @timems = datediff(ms, @starttime, sysdatetime());
SELECT 'memory-optimized table w/hash index and native SP:' + CAST(@timems as varchar(10)) + ' ms';


在此次的測試中主要進行三個動作:
a. 新增100000筆資料到傳統的資料庫中
b. 新增100000筆資料到記憶體優化的資料表(memory-optimized table)中。
c. 透過原生編譯的預存程序將100000筆資料新增到記憶體優化的資料表(memory-optimized table)中。

執行結果

從上述的測試中,我們發現在透過記憶體優化的資料表(memory-optimized table)進行處理(第二個測試),效能其實並沒有明顯的差異,但是在透過原生編譯的預存程序一同配合後,效能即約有3~4成的優化成長。

其實在In-Memory的部份目前限制還滿多的,而且並不是每一種資料庫都適用,根據官方的說法,目前只有下列的幾種情境倒是可以一試,但是從我的測試來看,如果沒有配合原生編譯的預存程序,效能改善 "可能" 有限,所以建議大家可以再多多的評估。

實作案例 實作案例 In-Memory OLTP 的優點
來自多個並行連接的高度資料插入比率。 主要的附加專用存放區。
跟不上插入工作負載。
排除競爭。
減少記錄。
定期批次插入和更新的讀取效能與比例調整。 高效能讀取作業,特別是在每個伺服器要求都有數個讀取作業要執行時。
無法符合相應增加的要求。
在新資料到達時排除競爭。
較低延遲的資料擷取。
將程式碼執行時間縮到最短。
資料庫伺服器中密集的商務邏輯處理。 插入、更新及刪除工作負載。
預存程序內部的大量計算。
讀寫競爭。
排除競爭。
將程式碼執行時間縮到最短,以減少延遲並提高輸送量。
低度延遲。 要求一般資料庫解決方案無法達成的低度延遲商務交易。 排除競爭。
將程式碼執行時間縮到最短。
低度延遲的程式碼執行。
有效率的資料擷取。
工作階段狀態管理。 經常性插入、更新及點查閱。
從許多無狀態的 Web 伺服器大範圍載入。
排除競爭。
有效率的資料擷取。
使用非持久性的資料表時,選擇性地減少或移除 IO

以上的資訊來自已MSDN:
In-Memory OLTP (記憶體中最佳化)
https://msdn.microsoft.com/zh-tw/library/dn133186(v=sql.120).aspx


*關於限制的部份,我這邊參考下列的網站整理成下列的列表:

參考網站:
SQL Server 2014, Part 3: Limitations of SQL Server 2014 In-Memory OLTP
http://blog.safepeak.com/sql-server-2014-part-3-limitations-sql-server-2014-memory-oltp/

1、Server and Database limitations
  • REPLICATION is not supported – Officially not supported, although in-memory tables can be defined as Subscribers (but not Publishers)
  • MIRRORING is not supported
  • DATABASE SNAPSHOT is not supported
  • 250GB limit per server – Total data in all loaded in-memory tables cannot exceed 250GB
  • MARS is not supported – Multiple Active Result Sets (MARS) is not supported with natively compiled stored procedures, so your application can’t use MARS connection to talk with the database
  • Change Data Capture (CDC) is not supported
  • DTC (distributed transactions) are not supported
  • RTO (Recovery Time Objective) of your High Availability – the Starting and Recovery time is slower – For every database object (table, stored procedure) SQL Server has to compile and link the corresponding DLL file (that is loaded afterwards into the process space of sqlservr.exe), and this also takes some time. The compilation and linking is also performed when you are restarting your SQL Server, or when you perform a cluster failover.

2、SCHEMA, KEYS, INDEXes, TRIGGERS  limitations:
  • FIXED Schema – You have to design your in-memory tables with knowledge of your data size. Indexes, statistics, and blocks cannot be changed / applied later.
  • ALTER TABLE for existing disk table is not supported – You can’t alter existing tables to become memory-optimized. You have to create new tables that are memory-optimized.
  • ALTER TABLE for in-memory table is not supported – You cannot add another column to a memory-optimized table in your production.
  • Row size limited to 8060 bytes
  • FOREIGN KEY’s and CHECK CONSTRAINTS are not supported
  • Datatypes:
  • Datetimeoffset, Geography, Hierarchyid, Image, Ntext, Text, Sql_variant, Varchar(max), Xml, User data types (UDTs) – not supported
  • CHAR and VARCHAR – Should be replaced to n(var)char
  • Various not supported TABLE and COLUMN definitions: IDENTITY, ON (file group or partition), Data type [name], Computed Columns, FILESTREAM, SPARSE, ROWGUIDCOL, UNIQUE
  • INDEX limitations: no COLUMNSTORE, CLUSTERED INDEX, no LOB datatypes
  • DDL TRIGGERS and Event Notifications (Server and Database level) – Have to be removed before creating or dropping memory-optimized tables and/or natively compiled procedures
  • LOGON TRIGGERS do not affect memory-optimized tables
  • DML TRIGGERS cannot be defined on memory-optimized tables – You can explicitly use stored procedures to insert, update, or delete data to simulate the effect of DML triggers.

3、T-SQL non supported operators:
  • Classic: OR, NOT, IN, LIKE, BETWEEN, CONTAINS, PERCENT, DISTINCT, NEXT VALUE FOR
  • UNION’s are  not supported
  • MIN, MAX – limited to non strings
  • LEFT / RIGHT / FULL OUTER JOIN – Outer joins return all rows from at least one of the tables or views mentioned in the FROM clause, as long as those rows meet any WHERE or HAVING search conditions – not supported (only Inner Joins are supported).
  • FOR XML, FOR BROWSE
  • Dynamic SQL (EXECUTE, EXEC) not supported
  • CURSORs are not supported
  • Sub-Queries are not supported

4、Transactions and Cross Database queries
  • BEGIN, COMIT, ROLLBACK are not supported – “Atomic Blocs” are an alternative
  • Cross Database queries and transactions are limited – You cannot access another database from the same transaction or the same query that also accesses a memory-optimized table. You can create Table Variables, create two transactions: 1) insert the data from the remote table into the variable; 2) Insert the data into the local memory-optimized table from the variable.
  • MERGE – A useful feature with performing insert, update, or delete operations on a target table based on the results of a join with a source table.

5、Functions, Views and Stored Procedures
  • User-defined functions cannot be used in natively compiled stored procedures
  • No In-Memory (“Native”) Functions
  • VIEWs – Views cannot be accessed from natively compiled stored procedures.
  • Disk-based tables cannot be accessed from natively compiled stored procedures. 

6、T-SQL window functions are not supported at all. Examples:
  • ROW_NUMBER()
  • RANK()
  • OVER (PARTITION BY …) or OVER (PARTITION BY …)

參考資料:
Demonstration: Performance Improvement of In-Memory OLTP
https://msdn.microsoft.com/en-us/library/dn530757.aspx
In-Memory OLTP (記憶體中最佳化)
https://msdn.microsoft.com/zh-tw/library/dn133186(v=sql.120).aspx
SQL Server 2014, Part 3: Limitations of SQL Server 2014 In-Memory OLTP
http://blog.safepeak.com/sql-server-2014-part-3-limitations-sql-server-2014-memory-oltp/
Transact-SQL Constructs Not Supported by In-Memory OLTP
https://msdn.microsoft.com/en-us/library/dn246937.aspx


關鍵字:In-Memory記憶體資料表Memory-Optimized TableNatively Compiled Stored Procedures

2015年6月27日 星期六

如何解決檔案被鎖定而無法刪除的問題

        最近要重整檔案,希望將一些舊有的備份檔進行刪除,但是卻發現在刪除時,無法進行,並且發生檔案無法讀取的錯誤,由於檔案數量過多,所以如果要透過排除法進行時,會較為耗時,所以我先將處理的過程整理如下。

首先我們先介紹一個解除鎖定的軟體,此軟體名為 "LockHunter",這是一個免費的軟體而且只有約3MB左右的大小,透過此軟體即可找出檔案是被誰所鎖住,詳細的說明與下載,可以參考官網說明。

LockHunter
http://lockhunter.com/download.htm


1、透過指令的方式進行。
由於透過檔案總管進行時,會發生檔案無法讀取的錯誤,所以我先嘗試透過Dos Command視窗輸入下列的指令進行。

del yourdeletefolder /S /Q

/S -> 由子目錄逐一刪除檔案
/Q -> 安靜模式,不要詢問是否要進行檔案的刪除

指令進行後,發現仍然會有空目錄無法刪除,所以再次透過下列的指令進行空目錄的刪除。

rmdir yourdeletefolder /S /Q

/S -> 由子目錄逐一刪除檔案
/Q -> 安靜模式,不要詢問是否要進行檔案的刪除

在指令進行後發現下列的錯誤畫面,發現主要就是這個資料夾造成的。


2、由於此檔案被鎖住,所以我們就透過 LockHunter 來進行解除,選擇目錄資料夾後,點選滑鼠右鍵 -> What is locking this file?


3、此時即會顯示出此檔案被那一個程式給鎖定,再點選下方的Unlock It!後,即可進行解除。


後續上你即可將此資料夾進行刪除。


關鍵字:LockHunterFile LockFolder LockUnlock檔案鎖定