Аутентификация System Center Operations Manager (SCOM) 1801 REST API в PHP

Я разрабатываю класс интеграции в PHP для доступа к данным SCOM с использованием нового интерфейса REST API. Я не могу найти дополнительную документацию для подключения к API с помощью PHP. Что у меня есть до сих пор это:

$url = "http://scomserver/OperationsManager/authenticate";
$username = 'myuser';
$password = 'myPassw0rd';
$request = "";
$cookie = tempnam("/tmp", "CURLCOOKIE");
$requestHeaders = array('Content-Type, application/json; charset=utf-8');
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, implode("\r\n", $requestHeaders));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_POST, count($request));
curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.7.3) Gecko/20041001 Firefox/0.10.1");
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_ENCODING, "");
curl_setopt($ch, CURLOPT_AUTOREFERER, TRUE);
curl_setopt($ch, CURLOPT_MAXREDIRS, -1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); 
curl_setopt($ch, CURLOPT_TIMEOUT, 400);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_NTLM);
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");

$buffer = curl_exec($ch);
$response = curl_getinfo( $ch );
curl_close($ch);

С этим кодом я получаю следующую ошибку:

{"errorMessage":"Passed parameter cannot be null","errorTrace":""}

И журналы IIS сообщают об ошибке 400.

Как я могу это исправить? Есть ли что-то, что мне не хватает?

Спасибо,
Энцо

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
784
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам не хватает тела запроса. При использовании проверки подлинности NTLM тело запроса должно уведомлять SCOM API о том, что вы это делаете. Для этого отправьте «Windows» как тело JSON в кодировке base-64, которое пусто в вашем коде. Обратитесь к этому примеру (он в PowerShell, но должен быть читаемым): https://community.squaredup.com/answers/question/scom-1801-rest-api/.

Другими словами, не вносите изменения в свой PHP-код, а:

$request = "Windows";
$request = utf8_encode($request);
$request = "\"".base64_encode($request)."\""; // should give you ["V2luZG93cw= = "]

Спасибо за ответ, Макс. Я пробовал несколько изменений в этом коде. Если я удаляю аутентификацию NTLM и передаю ее в теле, я получаю ошибку 401: неавторизованный, неправильное имя пользователя и пароль. Я также пробовал с несколькими разными данными в теле, но не повезло. Всегда одна и та же ошибка. Упомянутый вами код PowerShell отлично работает. Но я предполагаю, что должно быть что-то еще, что нужно сделать для PHP и CURL.

Enzo Medina 08.03.2019 18:06

Привет спасибо за тестирование. На самом деле, я еще раз внимательно прочитал его, и мой плохой ... Отредактировал ответ, чтобы исправить ошибку.

Max 09.03.2019 22:58

Здорово! Это сработало! Небольшое изменение: замените знак «плюс» на точку, чтобы объединить строки. Спасибо большое.

Enzo Medina 10.03.2019 01:24

Спасибо, отредактировал ответ для правильного оператора конкатенации. P.S. Я PHP вообще не знаю ))

Max 10.03.2019 21:18

Другие вопросы по теме