2012年12月13日 星期四

如何讓你的程式(exe)跟UAC(使用者帳戶控制 ) 好好相處?


前言
UAC(使用者帳戶控制 )是微軟在Windows Vista以後的作業系統中,所加入的一個安全性元件,主要目的是避免使用者在操作系統時,不小心執行到惡意程式而被植入木馬或病毒。

但是,連帶的,程式設計師若為產品或某正當目的撰寫的小程式,也可能因為UAC的關係而無法正常執行,特別是在這些小程式會對作業系統中的檔案或權限等資源進行異動時。筆者就曾寫了支要異動檔案內容的程式,因沒考慮到UAC問題,在執行時產生下列Exception:

************** 例外狀況文字 ************** System.UnauthorizedAccessException: 拒絕存取路徑 'E:............TXT'。 於 System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) 於 System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy) 於 System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options) 於 System.IO.StreamWriter.CreateFile(String path, Boolean append) 於 System.IO.StreamWriter..ctor(String path, Boolean append, Encoding
...

作法

這時有主要有三種方式可以解決:
  1. 關了UAC或以Administrator執行程式,
    • 缺點:得自行承擔電腦被惡意程式感染的風險。
  2. Trust ShortcutMicrosoft Application Compatibility Toolkit這類的工具包一下你寫好的程式,
    • 缺點:這類的工具只能在「用戶端」安裝並在「用戶端」設定。換言之,若你是公司的IT,當你寫好支程式要給10個 User用時,你必須先再這10個User的電腦先裝Trust Shortcut這類的程式,再設定允許你寫好的exe不受UAC干擾。當你服務的User越多時,就需付出更多的人力成本。
  3. 程式在執行時,自動跟使用者要求付予作業系統管理者(Administrator)權限,這是本文最建議的方法,實作步驟如下:
  • 使用Visual Studio 2008/2010在你的專案中,「加入」->「新增項目」
  • 在程式語言項目點選「一般」->「應用程式資訊清單檔案」,加入一個「app.manifest」檔案
  • 完成後,打開「app.manifest」檔案,編輯下列文字片段,找到「requestedExecutionLevel」tag,把「level」屬性改成「requireAdministrator」,重新建置後,即可。
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> <security> <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3"> <!-- UAC 資訊清單選項 如果要變更 Windows 使用者帳戶控制層級,請將 requestedExecutionLevel 節點以下列其中之一取代。 <requestedExecutionLevel level="asInvoker" uiAccess="false" /> <requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> <requestedExecutionLevel level="highestAvailable" uiAccess="false" /> 如果您要針對回溯相容性使用檔案及登錄虛擬化, 請刪除 requestedExecutionLevel 節點。 --> <requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> </requestedPrivileges> </security> </trustInfo>
總結
UAC雖然增加了些不方便,但也保護你的電腦及資料,降低遭惡意程式破壞的風險,原則上算是微軟良心之作,只要程式設計師在編程時,多注意點資訊安全問題,必可好好地跟它相處~

Reference
Windows 8 使用者帳戶控制 (UAC) 深入研究與專家密技分享
讓MDIE通過Windows 7的UAC默許,不再擾人
如何關閉VISTA中擾人的『使用者控制(UAC) 』
Getting the admin rights in C#
[MFC] 設定執行權限(UAC Execution Level)
Windows 7 安全小技巧:保持UAC開啟但不讓它跳出煩人訊息

2011年11月25日 星期五

查詢SQL Server目前連線(Connection)狀況

前言
我們的產品最近在某客戶家運作時,常固定某個時間就無法登入,目前發現是系統的料庫連線數超過,所造成。
又該資料庫不只我們產品在使用,為找出佔掉Connection的真兇,弄了這段SQL Statement來確認。

作法
--查詢目前連線數量 SELECT * FROM master..sysperfinfo where object_name = 'SQLServer:General Statistics' And counter_name = 'User Connections' --查詢目前連線數明細 Use Master SELECT c.session_id, c.connect_time,s.login_time, c.client_net_address, s.login_name,s.status FROM sys.dm_exec_connections c left join sys.dm_exec_sessions s on c.session_id = s.session_id

總結
Master 資料庫平常雖少用,但卻隱藏許多重要資料,在查問題時,真的是好用,值得花點時間去了解~

Reference

http://technet.microsoft.com/zh-tw/library/ms189806(SQL.100).aspx
http://technet.microsoft.com/zh-tw/library/ms181509(SQL.90).aspx
http://technet.microsoft.com/zh-tw/library/ms176013.aspx

2011年3月10日 星期四

用Transact-SQL來建立 DBLink Server

前言
最近因內部自行開發功能的需要,需把Database A(MS SQL Server 2005)設成自己連結的其中一台Link DB,使得Database A身上,有台DB Link Server就是A本身,除了以MS SQL的設定介面做,也可以選擇以SQL Command處理!

作法
--新增Link Server EXEC sp_addlinkedserver @server = 'ServerName', --伺服器名稱 @srvproduct = 'MS SQL', @datasrc = '127.0.0.1', --伺服器IP @provider = 'SQLNCLI' --新增Link Server的登入者及密碼 EXEC sp_addlinkedsrvlogin @rmtsrvname = '伺服器名稱', --伺服器名稱 @useself = 'false', @locallogin = NULL, @rmtuser = 'sa', --使用者 @rmtpassword = 'Password' --密碼 --移除Link Server EXEC sp_dropserver @server = 'ServerName' --伺服器名稱 --查詢DB Server中已設定的Link Server select * from sys.servers

總結
MS SQL DB Link Server在異機資料同步或處理上,雖然很方便但若資料量大,處理效能可就無法恭惟了(筆者OS:Oracle這部份強多了!),或許是我對MS SQL不夠熟吧,還是MS有其它我們不知道的Soultion, 歡迎有經驗的大德補充一下!^^…

Reference
http://www.dotblogs.com.tw/puma/archive/2009/02/05/7038.aspx
http://msdn.microsoft.com/zh-tw/library/ms190479.aspx

2010年11月1日 星期一

使用DataSet設定DataGridView值

Introduction
相信大家都清楚,DataSet我們通常用來定義資料的來源,而DataGridView用來定義資料的呈現及處理使用者對資料的操作,這種又分離又緊密的關係,可以使我們對資料的運用更加靈活,故這裡就簡單介紹一下如何以DataSet來當DataGridView的資料來源。

How to
假設已產生好DataSet物件及DataGridView控制項。
先產生要給DataSet的資料…
DataTable table = new DataTable();
table.Columns.Add("ID", typeof(string));
table.Columns.Add("Name", typeof(string));
table.Columns.Add("Value", typeof(string));

DataRow r = table.NewRow();
r["ID"] = "001";
r["Name"] = "AspNet";
r["Value"] = "DataSet Object";
table.Rows.Add(r);


接下來把資料塞入DataSet後,繫結到DataGridView控制項,即大功告成。
dsParseResult.Tables.Clear(); dsParseResult.Tables.Add(table); dsParseResult.AcceptChanges(); dgvParseResult.DataSource = dsParseResult.Tables[0].DefaultView;

註:拉DataGridView控制項,注意先別設定資料來源,否則資料會無法顯示。

Reference: