2010-03-03 93 views
2

我一直在這個問題上堅持了幾天 - 任何幫助,非常感謝。從服務器獲取Windows登錄名

我有一個SQL觸發器調用一個用C#編寫的DLL。在這個函數中,我需要發起啓動觸發器的SQL命令的人的Windows登錄名。無論我是否從C#或SQL獲取此信息都無關緊要。

不幸的是,大多數正常路線都失敗了。

內置SQL函數NT_C​​LIENT()僅適用於SQL登錄正在使用Windows身份驗證。

該DLL在服務器上運行,因此Environment.UserName與WindowsIdentity.GetCurrent()。Name無關,並且除非數據庫用戶(線程發起者)使用Windows身份驗證,否則返回空字符串。

我知道域名,IP地址和工作站名稱。從這裏我已經想出瞭如何在C#中獲取SID - 無論如何,我可以從使用C#的那些信息中獲取Windows登錄名,或者是否存在SQL內置函數,我錯過了?

編輯: 謝謝你讓我知道SQL是這個問題的一個啞巴。我們所擁有的是一個將每個人都作爲一個用戶登錄到數據庫的客戶端。我最終需要做的是做一個不安全的程序集,調用一個命令行函數WMIC。 Yucky的解決方案,但它完成了工作。再次感謝你提供的建議。 :)

+0

'SELECT user'返回什麼? – CaffGeek 2010-03-03 16:33:01

+0

我相信您需要將您的源應用程序中的信息作爲參數傳遞給您的服務器進程。我不確定你獲得的SID是什麼,我希望在Windows工作站有多個人登錄時,會有一個狀態,讓你可以返回多個SID(如果實際上可以)。 – Lazarus 2010-03-03 16:33:58

+0

有時候更容易停止旋轉你的車輪,並從不同的角度來接近它。也許觸發器不是可行的解決方案。也許你只需要開始研究其他方法來完成你的解決方案。 – 2010-03-03 16:38:49

回答

1

您必須從客戶端代碼中傳遞用戶名作爲參數。我們這樣做是每個來自我們的客戶代碼(網站和服務)的呼叫。

但是,即使那樣它在觸發器中不可用,所以我使用CONTEXT_INFO。

沒有魔力,沒有銀彈我很抱歉。

你的另一種選擇是查看安全帳戶授權/傳遞。 Google search ...有很多好東西,可能比一個特定的鏈接更好。

如果這是不可能的,你說你不能更改客戶端代碼,那麼它不能完成。數據根本不可用:並且應用程序體系結構故意這樣做。

0

你使用SQL身份驗證?如果是的話,我認爲這是不可能的,因爲Windows登錄與服務器登錄沒有關聯。

+0

是的,SQL身份驗證。我認爲這可能是不可能從SQL,我希望以某種方式,我可以從C#做到這一點。看來,給定的IP地址,工作站名稱等,應該有一種方法來找出誰在當前登錄在該位置。 – Brandi 2010-03-03 16:47:25

+0

看,有可能得到用戶登錄這個信息必須傳遞給sql server。當它是sql auth模式時,它不被傳遞。你可以得到IP和其他網絡的東西,但你不能得到沒有通過的東西。 – Andrey 2010-03-03 16:50:28

+0

我明白 - 很高興知道SQL不是獲取此信息的途徑。你是否也說過這些信息不能通過C#獨立於SQL獲得?我想,我正在尋找的是一些C#函數的效果:給出mydomainname,工作站名稱,IP地址,告訴我誰在當前登錄在這個位置?從目前我所知道的情況來看,這樣的事情並不存在,但是確認這種或那種方式是很好的。謝謝你讓我知道SQL是死路一條。 – Brandi 2010-03-03 17:10:28