Аутентификация 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":"Переданный параметр не может быть нулевым","errorTrace":""}

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

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

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


person Enzo Medina    schedule 06.03.2019    source источник


Ответы (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=="]
person Max    schedule 07.03.2019
comment
Спасибо за ответ, Макс. Я пробовал несколько изменений в этом коде. Если я удаляю аутентификацию NTLM и передаю ее в теле, я получаю ошибку 401: неавторизованный, неправильное имя пользователя и пароль. Я также пробовал с несколькими разными данными в теле, но не повезло. Всегда одна и та же ошибка. Упомянутый вами код PowerShell отлично работает. Но я предполагаю, что должно быть что-то еще, что нужно сделать для PHP и CURL. - person Enzo Medina; 08.03.2019
comment
Привет спасибо за тестирование. На самом деле, я еще раз внимательно прочитал его, и мой плохой ... Отредактировал ответ, чтобы исправить ошибку. - person Max; 10.03.2019
comment
Большой! Это сработало! Небольшое изменение: замените знак «плюс» на точку, чтобы объединить строки. Большое тебе спасибо. - person Enzo Medina; 10.03.2019
comment
Спасибо, отредактировал ответ для правильного оператора конкатенации. P.S. Я PHP вообще не знаю )) - person Max; 10.03.2019