Sql-Server

為什麼 xp_logininfo 會截斷 AD 使用者帳戶名稱?如何克服這一點?

  • June 13, 2017

根據這個問題,我使用以下 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

引用自:https://dba.stackexchange.com/questions/154303