MIM 2016 SSPR Türkçe Karakter Problemi

Samet Kara

Merhaba,

Bugün bir müşterimizde karşılaştığım ilginç bir hatayı ve bu hatayı çözmek için izlediğim yolu sizlerle paylaşmak istiyorum.

Bazı kullanıcılar Kendi Kendine Parola Sıfırlama Portalinde kullanıcı adlarını yazdıklarında aşağıdaki gibi bir hata ile karşılaşıyorlardı.

Günlük kayıtlarını incelediğimizde aşağıdaki gibi sonuçlarla karşılaştık.

Hatayı daha iyi inceleyebilmek için aşağıda vurguladığım fonksiyona erişmeye çalıştım.

Bunun için JetBrains'in DotPeek uygulamasını kullandım. Bu uygulama ile MIM Service kurulumunda bulunan tüm Dll ve exe dosyalarını açtım.

Microsoft.ResourceManagementWebServices.ResourceManagementService.GetUser(string nt4Name) fonksiyonunu buldum.

Bu fonksiyon DataAccess sınıfından GetUserFromName(nt4Name) fonksiyonunun çağırıldığını gördüm. İlgili sınıfı incelediğimde GetUserFromName(string name) fonksiyonunun kendisine iletilen name değerini ""karakterine göre ayırdığını ve elde ettiği iki değeri yine aynı sınıfta yer alan GetUserFromName(string domainName, string userName) fonksiyonunu çağırdığını, bu fonksiyonunda yine aynı sınıfta yer alan GetUser(string domainName, string userName) fonksiyonunu çağırdığını gördüm.

Son olarak GetUser(string domainName, string userName) fonksiyonunun "GetUserFromName" isimli stored procedure'ı çağırdığını gördüm.

İlgili stored procedure'ı aşağıda sizlerle paylaştım.

USE [MIMService]
GO
/****** Object:  StoredProcedure [fim].[GetUserFromName]    Script Date: 3/17/2022 3:49:32 PM ******/
SET
ANSI_NULLS
ON
GO
SET
QUOTED_IDENTIFIER
ON
GO
--Read Only
ALTER
PROCEDURE [fim].[GetUserFromName]
    @Name NVARCHAR (MAX),
    @DomainName NVARCHAR (MAX),
    @UserID UNIQUEIDENTIFIER
OUTPUT
AS
BEGIN
--********************************************************
--*                                                      *
--*   Copyright (C) Microsoft. All rights reserved.      *
--*                                                      *
--********************************************************
    SET
NOCOUNT
ON;
    SELECT @UserID = [fim].[GetEmptyGuid]()
    DECLARE @accountNameAttributeKey SMALLINT;
    SELECT @accountNameAttributeKey = [fim].[AttributeKeyFromName](N'AccountName');
    DECLARE @domainAttributeKey SMALLINT;
    SELECT @domainAttributeKey = [fim].[AttributeKeyFromName](N'Domain');
    DECLARE @userObjectTypeKey SMALLINT;
    SELECT @userObjectTypeKey = [fim].[ObjectTypeKeyFromName](N'Person');
    SELECT @UserID = [fim].[GetIdentifierFromObjectKey](ovsA.[ObjectKey])
    FROM [fim].[ObjectValueString] as [ovsA]
    INNER
JOIN [fim].[ObjectValueString] as [ovsD]
    ON
        [ovsA].[ObjectKey] = [ovsD].[ObjectKey]
    WHERE
            @Name = [ovsA].[ValueString]
        AND [ovsA].[ObjectTypeKey] = @userObjectTypeKey
        AND [ovsA].[AttributeKey] = @accountNameAttributeKey
        AND @DomainName = [ovsD].[ValueString]
        AND [ovsD].[ObjectTypeKey] = @userObjectTypeKey
        AND [ovsD].[AttributeKey] = @domainAttributeKey;
END

Bu stored procedure [fim].[ObjectValueString] tablosunda @Name kullanıcı adına ve @DomainName domain adına sahip nesne için ObjectKey değerini bulup daha sonra bu değeri kullanarak [fim].[GetIdentifierFromObjectKey] stored procedure ile ilgili hesaba ait identifier değerini bulmaktadır.

Bu stored procedure ile testleri yaptığımda herhangi bir problem göremedim. İlgili kullanıcının da bu stored procedure kullanılarak identifier bulunabildiğini gördüm. Bu nedenle araştırmama SQL Trace başlatarak incelememe devam ettim. Trace başlattıktan sonra tekrar SSPR üzerinden aynı kullanıcı ile test yaptım.

Trace sonucunu incelediğimde kullanıcı adını büyük harflerle ya da küçük harflerle yazmamızdan yada başına netbiosname değerini yazmamızdan bağımsız olarak çalıştırılan sql komutunda kullanıcı adının küçük "ı" karakteriyle geldiğini gördüm.

Aynı sql cümleciğini çalıştırdığımda kullanıcı için identifier değerinin bulunamadığını gördüm. Ancak sorguda küçük 'ı' karakterlerini 'i' ile değiştirdiğimde kullanıcı için identifier değerinin bulunabildiğini gördüm.

Bunun üzerine GetUserFromName stored procedure a kullanıcı adında bulunan küçük 'ı' karakterini 'i' ile değiştirecek bir satır ekledim. Stored procedure'ın son halini aşağıda paylaşıyorum.

USE [MIMService]
GO
/****** Object:  StoredProcedure [fim].[GetUserFromName]    Script Date: 3/17/2022 3:49:32 PM ******/
SET
ANSI_NULLS
ON
GO
SET
QUOTED_IDENTIFIER
ON
GO
--Read Only
ALTER
PROCEDURE [fim].[GetUserFromName]
    @Name NVARCHAR (MAX),
    @DomainName NVARCHAR (MAX),
    @UserID UNIQUEIDENTIFIER
OUTPUT
AS
BEGIN
--********************************************************
--*                                                      *
--*   Copyright (C) Microsoft. All rights reserved.      *
--*                                                      *
--********************************************************
-- SAMET KARA
    SELECT @Name=REPLACE(@Name, N'ı', N'i')
    SET
NOCOUNT
ON;
    SELECT @UserID = [fim].[GetEmptyGuid]()
    DECLARE @accountNameAttributeKey SMALLINT;
    SELECT @accountNameAttributeKey = [fim].[AttributeKeyFromName](N'AccountName');
    DECLARE @domainAttributeKey SMALLINT;
    SELECT @domainAttributeKey = [fim].[AttributeKeyFromName](N'Domain');
    DECLARE @userObjectTypeKey SMALLINT;
    SELECT @userObjectTypeKey = [fim].[ObjectTypeKeyFromName](N'Person');
    SELECT @UserID = [fim].[GetIdentifierFromObjectKey](ovsA.[ObjectKey])
    FROM [fim].[ObjectValueString] as [ovsA]
    INNER
JOIN [fim].[ObjectValueString] as [ovsD]
    ON
        [ovsA].[ObjectKey] = [ovsD].[ObjectKey]
    WHERE
            @Name = [ovsA].[ValueString]
        AND [ovsA].[ObjectTypeKey] = @userObjectTypeKey
        AND [ovsA].[AttributeKey] = @accountNameAttributeKey
        AND @DomainName = [ovsD].[ValueString]
        AND [ovsD].[ObjectTypeKey] = @userObjectTypeKey
        AND [ovsD].[AttributeKey] = @domainAttributeKey;
END

Bu değişiklikten sonra ilk sorguyu tekrar çalıştırdığımda identifier değerinin bulunabildiğini gördüm.

Daha sonra tekrar kullanıcının parolasını değiştirmeyi denediğimizde başarılı olduğunu gördük.

Last updated