Я новичок в 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();
1 ответ
Пара вещей, которые вы могли бы улучшить:
- Не используйте
select *
в своих SQL-запросах. Всегда указывайте нужные поля в нужном вам порядке. Как написано, если бы кто-то реструктурировал таблицу так, чтобы идентификатор пользователя не был первым столбцом, у вас был бы беспорядок, потому что вы обращаетесь к полям по их порядковому номеру. - Очевидно, вы храните эти пароли в открытом виде в своей базе данных. Любой, у кого есть доступ к вашей базе данных, знает учетные данные каждого из ваших пользователей. Это очень плохо. Решение этой проблемы может потребовать очень большой дискуссии.
- Ваш код сохраняет соединение с базой данных открытым до завершения сценария. Принимая во внимание масштаб здесь, это вероятно не вызовет серьезных проблем, но ваша стратегия доступа к базе данных должна заключаться в том, чтобы войти, получить ваши данные, выйти и отключиться как можно быстрее.
$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;
}
}
select *
. Я тяну только нужные мне столбцы. 2. Да, мы храним пароли в виде открытого текста. Но для нашей цели это действительно не проблема. 3. Спасибо за это. Я совершенно забыл, что могу заполнить набор данных и использовать ForEach-Object
(это довольно ново и все такое :-).
Похожие вопросы
Новые вопросы
web-services
«Веб-сервис» - это программная система, предназначенная для поддержки взаимодействия компьютеров между компьютерами через Всемирную паутину.