Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Lỗi:Không thể tìm nạp một hàng từ ADsDSOObject của nhà cung cấp OLE DB cho ADSI máy chủ được liên kết

Tôi cũng gặp phải vấn đề này và không thích giải pháp phân trang thông thường được đăng bằng chữ cái đầu tiên của tên tài khoản. Điều này có nghĩa là 26 cuộc gọi riêng biệt đến AD và cũng có thể vẫn có khả năng thất bại vì với một miền lớn, rất có thể có hơn 901 tài khoản bắt đầu bằng cùng một chữ cái đầu tiên - đặc biệt nếu bạn đang xem xét các tài khoản máy tính, điều này có thể tuân theo một số hệ thống quy ước đặt tên sử dụng cùng một chữ cái đầu tiên ...

Tôi đã thực hiện một số trò chơi và tôi thấy rằng nếu bạn đặt hàng truy vấn mở bởi uSNC đã tạo và đặt mệnh đề TOP 901 trên truy vấn bên ngoài, nó sẽ không bị hỏng.

Vì vậy, đây là SQL của tôi tìm nạp TẤT CẢ các đối tượng thư mục hoạt động (máy tính, bộ điều khiển miền, người dùng và địa chỉ liên hệ) vào một bảng tạm thời với 901 bản ghi và cung cấp cho bạn một số thông tin hữu ích về từng đối tượng.

CREATE TABLE #ADData(
    Login           NVARCHAR(256)
    ,CommonName     NVARCHAR(256)
    ,GivenName      NVARCHAR(256)
    ,FamilyName     NVARCHAR(256)   
    ,DisplayName    NVARCHAR(256)
    ,Title          NVARCHAR(256)
    ,Department     NVARCHAR(256)
    ,Location       NVARCHAR(256)
    ,Info           NVARCHAR(256)
    ,LastLogin      BIGINT
    ,flags          INT
    ,Email          NVARCHAR(256)
    ,Phone          NVARCHAR(256)   
    ,Mobile         NVARCHAR(256)
    ,Quickdial      NVARCHAR(256)
    , usnCreated    INT
)

DECLARE @Query      VARCHAR (2000)
DECLARE @Filter     VARCHAR(200)
DECLARE @Rowcount   INT

select @Filter =''

WHILE ISNULL(@rowcount,901)  = 901 BEGIN

    SELECT @Query = '
    SELECT top 901
            Login           = SamAccountName
            , CommonName    = cn
            , GivenName
            , FamilyName    = sn    
            , DisplayName
            , Title
            , Department
            , Location      = physicalDeliveryOfficeName
            , Info
            , LastLogin     = CAST(LastLogon AS bigint)
            , flags         = CAST (UserAccountControl as int)
            , Email         = mail
            , Phone         = telephoneNumber
            , Mobile        = mobile
            , QuickDial     = Pager
            , usnCreated
        FROM OPENROWSET(''ADSDSOObject'', '''', ''
                SELECT cn, givenName, sn, userAccountControl, lastLogon, displayName, samaccountname, 
                title,  department, physicalDeliveryOfficeName, info, mail, telephoneNumber, mobile, pager, usncreated
            FROM ''''LDAP://[ldap-query-string]'''' 
            WHERE objectClass=''''Person''''
            AND objectClass = ''''User''''
            ' + @filter + '
            ORDER BY usnCreated'')'             
    INSERT INTO #ADData EXEC (@Query) 
    SELECT @Rowcount = @@ROWCOUNT
    SELECT @Filter = 'and usnCreated > '+ LTRIM(STR((SELECT MAX(usnCreated) FROM #ADData)))

END

SELECT LOGIN            
        , CommonName    
        , GivenName
        , FamilyName
        , DisplayName
        , Title         
        , Department
        , Location      
        , Email         
        , Phone         
        , QuickDial     
        , Mobile        
        , Info          
        , Disabled      = CASE WHEN CAST (flags AS INT) & 2 > 0 THEN 'Y' ELSE NULL END 
        , Locked        = CASE WHEN CAST (flags AS INT) & 16  > 0 THEN 'Y' ELSE NULL END 
        , NoPwdExpiry   = CASE WHEN CAST (flags AS INT) & 65536  > 0 THEN 'Y' ELSE NULL END 
        , LastLogin     = CASE WHEN ISNULL(CAST (LastLogin AS BIGINT),0) = 0 THEN NULL ELSE 
                            DATEADD(ms, (CAST (LastLogin AS BIGINT) / CAST(10000 AS BIGINT)) % 86400000,
                            DATEADD(day, CAST (LastLogin AS BIGINT) / CAST(864000000000 AS BIGINT) - 109207, 0)) END 
        , Type = CASE WHEN flags  & 512 = 512 THEN 'user' 
                    WHEN flags IS NULL THEN 'contact' 
                    WHEN flags & 4096 = 4096 THEN 'computer'
                    WHEN flags & 532480 = 532480 THEN 'computer (DC)' END
FROM #ADData
ORDER BY Login

DROP TABLE #ADData


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MappingException Edm.String không tương thích với SqlServer.varbinary

  2. CTE vòng lặp vô hạn với TÙY CHỌN (maxrecursion 0)

  3. Gợi ý khóa bảng mặc định trên SQL Server 2005/2008

  4. INT so với Mã nhận dạng duy nhất cho trường ID trong cơ sở dữ liệu

  5. SQL Server 2008:CHỌN CẬP NHẬT