Как пройти аутентификацию, используя имя пользователя / пароль / домен через ManagementScope - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть утилита, которую я написал, что проверяет (среди прочего), когда в последний раз набор серверов был перезагружен.Это прекрасно работает, если все серверы находятся в моем домене, а пользователь, запускающий приложение, имеет права на серверы.Добавлен раздел, в котором пользователь может указать альтернативные учетные данные, в нашем случае специально для работы с другим доменом.Учетные данные, которые я передаю, имеют права администратора домена в целевом домене, но мой код получает ошибку «Отказано в доступе (несанкционированный доступ)».

спасибо!

private void btnLastReboot_Click(object sender, EventArgs e)
    {
        ConnectionOptions conOpts = new ConnectionOptions();

        if (selectedList.Count > 0)
        {
            Cursor currentCursor = Cursor.Current;
            Cursor.Current = Cursors.WaitCursor;

            stripProgress.Visible = true;
            stripProgress.Minimum = 0;
            stripProgress.Maximum = selectedList.Count();
            stripProgress.Step = 1;
            stripProgress.Value = 0;

            rtfOut.SelectionTabs = new int[] { 100, 200 };
            rtfOut.Text = "";

            var sq = new SelectQuery("Win32_OperatingSystem");

            if (prefs.useCurrentUser == true)
            {
                // Setting all fields to NULL causes current user info to be used
                conOpts.Username = null;
                conOpts.Password = null;
                conOpts.Authority = null;
            }
            else
            {
                conOpts.Username = prefs.userName;
                conOpts.Password = prefs.password.ToString();
                conOpts.Authority = "ntlmdomain:" + prefs.domain;

            }

            foreach (ServerList anEntry in selectedList)
            {
                stripProgress.Value++;

                try
                {
                    var mgmtScope = new ManagementScope("\\\\" + anEntry.ServerName + "\\root\\cimv2", conOpts);
                    mgmtScope.Connect();
                    var mgmtSearcher = new ManagementObjectSearcher(mgmtScope, sq);
                    foreach (var item in mgmtSearcher.Get())
                    {
                        var lastBoot = item.GetPropertyValue("LastBootUpTime").ToString();
                        DateTime lboot = ManagementDateTimeConverter.ToDateTime(lastBoot);
                        rtfOut.Text += anEntry.ServerName + "\t";
                        if(anEntry.ServerName.Length <= 9)
                        {
                            rtfOut.Text += "\t";
                        }
                        rtfOut.Text += lboot.ToLongDateString() + " (" + lboot.ToLongTimeString() + ")\r\n";
                    }
                }
                catch (Exception ex)
                {
                    if (ex is UnauthorizedAccessException)
                    {
                        rtfOut.Text += anEntry.ServerName + "\t <Access Denied>\r\n";
                    }
                    else
                    {
                        rtfOut.Text += anEntry.ServerName + "\t <not responding>\r\n";
                    }
                }
            }

            stripProgress.Visible = false;
            Cursor.Current = currentCursor;
        }
    }

1 Ответ

0 голосов
/ 14 ноября 2018

Пришлось спать на нем, но ответ, наконец, ударил меня в душе ...

Я храню пароль, предоставленный пользователем, в переменной SecureString, но поле пароля ConnectionOptions ожидает значение в видеочистить строкуЯ смог проверить это путем временного жесткого кодирования пароля, который затем сработал.Окончательное решение состояло в том, чтобы преобразовать SecureString в чистую строку и затем назначить ее для ConnectionOption.

Если кому-то интересно, я использовал этот бит для преобразования пароля обратно:

string password = new System.Net.NetworkCredential(string.Empty, securePassword).Password;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...