Учетная запись пользователя с альтернативным суффиксом UPN - PullRequest
0 голосов
/ 08 октября 2019

У нас есть домен boo.com , а также кто-то определил альтернативный суффикс UPN bc . Существует учетная запись, созданная как foo @bc. Мне нужно выдать себя за эту учетную запись, чтобы подключиться к SQL Server.

Вот что я делаю:

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

LogonUser( 
    "foo",//foo@bc
    "boo.com",//"@bc"
     "Password",
     (int)LogonType.LOGON32_LOGON_INTERACTIVE,//(int)LogonType.LOGON32_LOGON_SERVICE,//(int)LogonType.LOGON32_LOGON_NEW_CREDENTIALS,//(int)LogonType.LOGON32_LOGON_NETWORK,//
     (int)LogonProvider.LOGON32_PROVIDER_DEFAULT,//(int)LogonProvider.LOGON32_PROVIDER_WINNT50,//
     ref m_Token);
...

Кажется, что олицетворение работает - LogonUser (...) завершается успешно, но мой сценарий нене имеет надлежащего доступа. В зависимости от комбинации параметров я получаю

System.IO.FileLoadException: Имя файла: 'System.Data, ...

В Sysinternals Process Monitor я вижу «ПЛОХАЯ ПРЕВЫШЕНИЕ» ошибка.

или, если я играю с LogonType и LogonProvider

System.Data.SqlClient.SqlException: 'Ошибка входа. Логин входит в ненадежный домен и не может использоваться с аутентификацией Windows. '

Есть ли способ выдать себя за учетную запись AD, для которой задан альтернативный суффикс UPN?

Да, и еслиЯ запускаю из-под учетной записи "foo" все работает, то есть foo имеет все необходимые права доступа. К сожалению, мне нужно запустить из другой учетной записи службы.

Спасибо !!!

1 Ответ

0 голосов
/ 09 октября 2019

Методом проб и ошибок, вот что у меня получилось:

LogonUser( 
"foo@bc",//username with suffix
 NULL,   //domain
 "Password",
 (int)LogonType.LOGON32_LOGON_NEW_CREDENTIALS, //logon type
 (int)LogonProvider.LOGON32_PROVIDER_DEFAULT,
 ref m_Token);

Console.WriteLine("Current user: " + WindowsIdentity.GetCurrent().Name);
//John Doe - person running the app

WindowsIdentity identity = new WindowsIdentity(m_Token);
identity.Impersonate();

Console.WriteLine("Current user: " + WindowsIdentity.GetCurrent().Name);
//still John Doe!! NOT foo@bc

//database access successful (Integrated Security)

на удивление

WindowsIdentity.GetCurrent (). Имя

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

...