Олицетворение в Windows Server 2008

Я пытаюсь выдать себя за конкретного пользователя для выполнения некоторых операций sql на нашем сервере. Это не приложение ASP.Net. Я использовал предоставленный код раньше, и это сработало. Но недавно мы обновили нашу среду с Windows Server 2000 до Windows Server 2008 R2. После этого обновления этот код у меня не работает. Мне нужна помощь в понимании этой проблемы и помощи в ее решении. Любая помощь будет оценена по достоинству. Спасибо.

Предоставленный код является псевдокодом, пытающимся записать в файл и выполнить операцию sql.

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Runtime.InteropServices;
using System.Text;
using System.IO;
using System.Security.Principal;
using System.Security.Permissions;

[assembly: SecurityPermissionAttribute(SecurityAction.RequestMinimum, UnmanagedCode = true)]
[assembly: PermissionSetAttribute(SecurityAction.RequestMinimum, Name = "FullTrust")]
public class Test
{
    const int LOGON32_LOGON_INTERACTIVE = 2;
    const int LOGON32_LOGON_NETWORK = 3;
    const int LOGON32_LOGON_BATCH = 4;
    const int LOGON32_LOGON_SERVICE = 5;
    const int LOGON32_LOGON_UNLOCK = 7;
    const int LOGON32_LOGON_NETWORK_CLEARTEXT = 8;
    const int LOGON32_LOGON_NEW_CREDENTIALS = 9;
    const int LOGON32_PROVIDER_DEFAULT = 0;
    const int SecurityImpersonation = 2;

    [DllImport("advapi32.dll", SetLastError = true)]
    public static extern int LogonUser(
        string lpszUsername,
        string lpszDomain,
        string lpszPassword,
        int dwLogonType,
        int dwLogonProvider,
        out IntPtr phToken
        );

    [DllImport("advapi32.dll", SetLastError = true)]
    public static extern int ImpersonateLoggedOnUser(
        IntPtr hToken
    );

    [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public extern static bool DuplicateToken(IntPtr ExistingTokenHandle,
      int SECURITY_IMPERSONATION_LEVEL, ref IntPtr DuplicateTokenHandle);

    [DllImport("advapi32.dll", SetLastError = true)]
    static extern int RevertToSelf();

    [DllImport("kernel32.dll", SetLastError = true)]
    static extern int CloseHandle(IntPtr hObject);

    public void TestImpersonation()
    {            
        IntPtr lnToken = new IntPtr(0);
        IntPtr dupeTokenHandle = new IntPtr(0);
        StringBuilder sb = new StringBuilder();

        int TResult = LogonUser("itservices", "DFC", "St4hls345t", LOGON32_LOGON_NETWORK,
                LOGON32_PROVIDER_DEFAULT, out lnToken);
        if (TResult > 0)
        {
            bool retVal = DuplicateToken(lnToken, SecurityImpersonation, ref dupeTokenHandle);
            if (false == retVal)
            {
                CloseHandle(lnToken);
                Console.WriteLine("Exception thrown in trying to duplicate token.");
                return;
            }

            WindowsIdentity newId = new WindowsIdentity(dupeTokenHandle);
            WindowsImpersonationContext impersonatedUser = newId.Impersonate();

            writeLog(DateTime.Now.ToString(@"MM-dd-yyyy HH:mm:ss") + " - Impersonation Applied" + Environment.NewLine);
            runQuery();
            impersonatedUser.Undo();
            writeLog(DateTime.Now.ToString(@"MM-dd-yyyy HH:mm:ss") + " - Impersonation Reverted" + Environment.NewLine);
            runQuery();
            CloseHandle(lnToken);
        }
        else
        {
            writeLog(DateTime.Now.ToString(@"MM-dd-yyyy HH:mm:ss") + " - Impersonation not Applied" + Environment.NewLine);
        }

        return;
    }

    void writeLog(string message)
    {
        try
        {
            string filePath = @"E:\Impersonate\Testlog.txt";
            File.AppendAllText(filePath, message);
        }
        catch
        {
            Console.WriteLine();
        }
    }

    void runQuery()
    {
        SQLOperations sqlUtill = new SQLOperations();
        string cmdTxt = "SELECT * FROM [tblChildOrder] where [StahlsWorkOrderID] = 'DREAMFUL0015799'";
        DataTable dt = sqlUtill.executeQuery(cmdTxt);
        if (dt != null)
        {
            Console.WriteLine();
        }
        else
        {
            Console.WriteLine();
        }
    }
}

person Teja    schedule 29.11.2012    source источник


Ответы (1)


Большинство обновлений, которые ломали мой код, обычно были вызваны обновлением, изменяющим разрешение для пользователей. Дважды проверьте пользователей, разрешения, которые у них есть, и вы должны найти проблему.

person Rv3    schedule 11.12.2012