Я новичок в PowerShell и новичок (как и сегодня) в веб-сервисах и SOAP. Поставщик предоставил нам документацию по API своего веб-сервиса, которая позволяет создавать учетные записи пользователей. Я пытаюсь использовать PowerShell, чтобы вытащить наших пользователей из SQL Server и отправить данные в их службу. Нам нужно будет добавлять пользователей на постоянной основе.

Ниже приведена урезанная версия того, что я придумал, и, похоже, это действительно работает; поставщик сказал мне включить параметр dry_run во время тестирования, и я получаю dry_run_success от response_type.

Мой вопрос: близок ли это к подходящему способу сделать это с помощью PowerShell?

# Open ADO.NET Connection to database
$dbConn = New-Object Data.SqlClient.SqlConnection;
$dbConn.ConnectionString = "Data Source=mydbserver;User ID=someuserid;Password=mypassword;Initial Catalog=mydatabase";
$dbConn.Open();
$sql = "select * from mytable";
$dbSqlCmd = New-Object Data.SqlClient.SqlCommand $sql, $dbConn;
$dbRd = $dbSqlCmd.ExecuteReader();

# Create a Web Service Proxy
$proxy = New-WebServiceProxy -Uri https://somedomain.com/service/wsdl
$namespace = $proxy.GetType().NameSpace
$param = New-Object($namespace + ".somemethod")

# Loop through records from SQL and invoke the web service
While ($dbRd.Read())
{
    $param.user_id = $dbRd.GetString(0)
    $param.password = $dbRd.GetString(1)
    $param.display_name = $dbRd.GetString(2)

    $request = $proxy.TheMethod($param)

    if ($request.response_type -eq 'error')
    {
        $request.error.extended_error_text
    }
}

# Clean up
$dbRd.Close();
$dbSqlCmd.Dispose();
$dbConn.Close();
0
DakotaPaul 25 Фев 2016 в 03:09
Позволяет ли API отправлять несколько запросов за один вызов? Если так, я бы рекомендовал делать это, а не делать их индивидуально.
 – 
alroc
25 Фев 2016 в 03:54
Я не думала спрашивать их об этом, но я сделаю это. Спасибо!
 – 
DakotaPaul
25 Фев 2016 в 19:17
Я спросил у поставщика, и, к сожалению, они разрешают только один запрос на звонок.
 – 
DakotaPaul
25 Фев 2016 в 19:51

1 ответ

Лучший ответ

Пара вещей, которые вы могли бы улучшить:

  1. Не используйте select * в своих SQL-запросах. Всегда указывайте нужные поля в нужном вам порядке. Как написано, если бы кто-то реструктурировал таблицу так, чтобы идентификатор пользователя не был первым столбцом, у вас был бы беспорядок, потому что вы обращаетесь к полям по их порядковому номеру.
  2. Очевидно, вы храните эти пароли в открытом виде в своей базе данных. Любой, у кого есть доступ к вашей базе данных, знает учетные данные каждого из ваших пользователей. Это очень плохо. Решение этой проблемы может потребовать очень большой дискуссии.
  3. Ваш код сохраняет соединение с базой данных открытым до завершения сценария. Принимая во внимание масштаб здесь, это вероятно не вызовет серьезных проблем, но ваша стратегия доступа к базе данных должна заключаться в том, чтобы войти, получить ваши данные, выйти и отключиться как можно быстрее.
$sql = "select user_id, password, display_name from mytable";
$QueryCmd = $dbConn();
$QueryCmd.CommandText = $sql;
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter;
$QueryCmd.Connection = $dbConn;
$SqlAdapter.SelectCommand = $QueryCmd;
$DataSet = New-Object System.Data.DataSet;
$SqlAdapter.Fill($DataSet)
$dbConn.Close();
$dbConn.Dispose();

$MyResults = $DataSet.Tables[0];
$MyResults | foreach-object {
    $param.user_id = $_.user_id;
    $param.password = $_.password;
    $param.display_name = $_.display_name;

    $request = $proxy.TheMethod($param);

    if ($request.response_type -eq 'error')
    {
        $request.error.extended_error_text;
    }
}
2
alroc 25 Фев 2016 в 04:14
Спасибо за отзыв, alroc. 1. Для краткости я использовал select *. Я тяну только нужные мне столбцы. 2. Да, мы храним пароли в виде открытого текста. Но для нашей цели это действительно не проблема. 3. Спасибо за это. Я совершенно забыл, что могу заполнить набор данных и использовать ForEach-Object (это довольно ново и все такое :-).
 – 
DakotaPaul
25 Фев 2016 в 19:12
Хранение паролей в виде открытого текста всегда является проблемой.
 – 
alroc
25 Фев 2016 в 19:32
Обсуждение в другой раз. :)
 – 
DakotaPaul
25 Фев 2016 в 19:51