Sql-Server
為什麼 xp_logininfo 會截斷 AD 使用者帳戶名稱?如何克服這一點?
根據這個問題,我使用以下 SP 來查看在我的數據庫伺服器中添加為“登錄”的 AD 組中的成員。
EXEC master.dbo.xp_logininfo 'MyDomain\ADGROUPNAME' , 'members'
問題是,結果數據只給了我最多 30 個字元的使用者帳戶名。這是因為在 Active Directory 中,有兩組帳戶名稱,一組表示 pre-windows-2000 ,另一組表示 post-windows 2000。前一組被截斷,這就是我得到的一組。
**例如,**如果 AD 組中的使用者帳戶是:MyDomain\ShortName,我會得到 MyDomain\ShortName。但是如果賬戶名是:MyDomain\HasOverThirtyCharacters,那麼我會得到 MyDomain\HasOverThirtyCharact
我如何克服這個限制?我可以用什麼代替 xp_logininfo?
我完成這項工作的方法是:
SELECT @@SERVERNAME ----myserver DECLARE @NTLogin nvarchar(128) ; SET @NTLogin = 'mydomain\myuser' DECLARE @UserList TABLE ( [Account Name] nvarchar(128)collate Latin1_General_CI_AS, [Type] nvarchar(128) collate Latin1_General_CI_AS, [Privilege] nvarchar(128) collate Latin1_General_CI_AS, [Mapped Login Name] nvarchar(128)collate Latin1_General_CI_AS, [Permission Path] nvarchar(128) ) INSERT INTO @UserList EXEC master.dbo.xp_logininfo @NTLogin, 'all' --insert group information IF EXISTS (SELECT * FROM @UserList WHERE [Type] = 'group') --only if it's a group INSERT INTO @UserList EXEC master.dbo.xp_logininfo @NTLogin, 'members' --insert member information SELECT [Server Name] = @@SERVERNAME, [Account Name], [Type], [Privilege], [Mapped Login Name], [Permission Path] FROM @UserList
您可以將程式碼作為參數包裝在儲存過程中
@ntLogin
,這就是我在這裡所做的,包括錯誤處理的東西,這也很重要。另一件事是為windows powershell安裝活動目錄模組
還可以從 sql server 內部進行測試,您可以執行以下腳本:
DECLARE @User VARCHAR(20) SELECT @USER = SUBSTRING(SUSER_SNAME(), CHARINDEX('\', SUSER_SNAME()) + 1, LEN(SUSER_SNAME())) SELECT @USER , SUSER_SNAME() ,SYSTEM_USER , USER_NAME() , CURRENT_USER , ORIGINAL_LOGIN() ,USER ,SESSION_USER
這將顯示您的憑據
如果你作為你正在測試的登錄名執行,你可以看到它的樣子。
EXECUTE AS LOGIN='yourdomain\the_long_login' DECLARE @User VARCHAR(20) SELECT @USER = SUBSTRING(SUSER_SNAME(), CHARINDEX('\', SUSER_SNAME()) + 1, LEN(SUSER_SNAME())) SELECT @USER , SUSER_SNAME() ,SYSTEM_USER , USER_NAME() , CURRENT_USER , ORIGINAL_LOGIN() , USER ,SESSION_USER REVERT