Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Розсылка сообщений клиентам  [new]
shanton
Member

Откуда: Украина г. Хмельницкий
Сообщений: 628
Помогите разобратся! Нужно сделать розсылку сообщений клиентам. Планирую реализовать с помощью WTS API через dll с CLR-процедурой. Есть тема с примером:

EXEC xp_cmdshell Подскажите как послать сообщение на ОС Win Vista и Win 7

у меня проблема с созданием сборки. Какой тип проекта нужно создавать чтобы пример который приводится в этой темеме заработал. Пробовал создавать проект обычной библиотеки классов, язык c#, версия .Net 3.5, с CLR-процедурой вызова команд ОС:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Diagnostics; 


namespace IT_INF_ClassLibraryCmd
{
    public class Class1
    {

        //Тег, определяющий, что данная функция возвращает таблицу
        [Microsoft.SqlServer.Server.SqlFunction(FillRowMethodName = "FillRow",
        TableDefinition = "txt nvarchar(4000)")]
        public static System.Collections.IEnumerable FCmd(SqlString commandToRun, SqlString args)
        {
            Process p = new Process();
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.FileName = commandToRun.Value;
            p.StartInfo.Arguments = args.Value;
            p.Start();

            string value = p.StandardOutput.ReadToEnd();
            string[] spl = value.Split('\n');

            p.WaitForExit();
            return spl.ToArray();
        }

        //Функция заполнения таблицы
        public static void FillRow(Object obj, out string stringElement)
        {
            stringElement = obj.ToString();//Возвращает в таблицу строку
        }
    }
}

и посылать команды с SQL Servera:
-- добавим права на стороне SQL-сервера, для того чтобы пользователь мог зарегистрировать сборку
USE [master]
GO
ALTER DATABASE DATD SET TRUSTWORTHY ON
GO
--
USE [DATD]
GO
ALTER DATABASE DATD
   SET TRUSTWORTHY ON
GO
USE [DATD]
GO
CREATE ASSEMBLY [System.Drawing]
FROM 'C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Drawing.dll'
WITH PERMISSION_SET = UNSAFE
GO
-- регистрируем системную сборку
CREATE ASSEMBLY [System.Core]
AUTHORIZATION [dbo]
FROM 'C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Core.dll'
WITH PERMISSION_SET = UNSAFE
GO
-- регистрируем нашу сборку
USE DATD
GO

create assembly IT_INF_CmdAssembly from 'D:\sql\DLL\SQL_CLR_Csh.dll' with permission_set = unsafe 
GO
-- создаём функцию, которая будет работать с методом класса
USE [DATD]
GO

CREATE FUNCTION FCmd
    ( 
          @cmd nvarchar(max), 
          @args nvarchar(max)
    ) 
    RETURNS table (txt nvarchar(4000))
    AS 
      EXTERNAL NAME IT_INF_CmdAssembly.[SQL_CLR_Csh.Class1].FCmd 
-- пример использования
/* Стандартный вызов */
USE [DATD]
GO

select * FROM dbo.FCmd('ping', '192.168.0.1')
GO

то работает нормально. Подскажите пожалуйста какой лучше вариант выбрать, и как правельно его реализовать?
22 май 15, 15:38    [17677527]     Ответить | Цитировать Сообщить модератору
 Re: Розсылка сообщений клиентам  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8823
Чем Вам не нравится встроенная почтовая система?
22 май 15, 16:17    [17677815]     Ответить | Цитировать Сообщить модератору
 Re: Розсылка сообщений клиентам  [new]
shanton
Member

Откуда: Украина г. Хмельницкий
Сообщений: 628
Владислав Колосов
Чем Вам не нравится встроенная почтовая система?

Встроення куда? В ОС, или в SQL Server?
Раньше мы посылали сообщения с помощью NET SEND, но проблема возникла после перехода на Win 7.
Задача стоит периодично, с определённым интервалом, показывать клиенту на экран текст собщения, пока он не выполнит определённое действие.
25 май 15, 17:01    [17686685]     Ответить | Цитировать Сообщить модератору
 Re: Розсылка сообщений клиентам  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8823
shanton, в SQL server. Читайте справку по Database Mail.
25 май 15, 18:26    [17687137]     Ответить | Цитировать Сообщить модератору
 Re: Розсылка сообщений клиентам  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
shanton
Раньше мы посылали сообщения с помощью NET SEND, но проблема возникла после перехода на Win 7.
Задача стоит периодично, с определённым интервалом, показывать клиенту на экран текст собщения, пока он не выполнит определённое действие.
Для Windows Vista и старше вместо net send нужно использовать команду msg
25 май 15, 18:38    [17687213]     Ответить | Цитировать Сообщить модератору
 Re: Розсылка сообщений клиентам  [new]
shanton
Member

Откуда: Украина г. Хмельницкий
Сообщений: 628
Владислав Колосов
shanton, в SQL server. Читайте справку по Database Mail.

В даном случае я так понимаю, письмо уйдёт на почтовый ящик. У меня стоит задача показать текст сообщения клиенту на экран, аналогия net send. Человек сидит за компьютером, а ему каждые 5 минут появляется окно "Подпиши документи!", пока он этот документ не подпишет. Хотеелось бы попробовать сделать это через sql dll с помощью WTSSendMessage.
26 май 15, 09:42    [17689273]     Ответить | Цитировать Сообщить модератору
 Re: Розсылка сообщений клиентам  [new]
Jaffar
Member

Откуда:
Сообщений: 633
shanton,

делать можно так и никаких сборок городить не нужно.
declare @STR varchar(8000)
select @STR = 'msg "192.168.01.01" "Подпиши Документ!!!"'
exec xp_cmdshell @STR --, no_output


2.если выполнение процедуры xp_cmdshell отключено - то
exec sp_configure 'xp_cmdshell', 1
reconfigure

3.если задача будет выполняться не под sysadmin - то можно создать обертку для процедуры xp_cmdshell

типа

create procedure xp_cmd(@STR varchar(8000), @output int)
wiht execute as 'sa'
AS
BEGIN

if(output = 1) exec xp_cmdshell @STR
else exec xp_cmdshell @STR, no_output


END
26 май 15, 10:06    [17689382]     Ответить | Цитировать Сообщить модератору
 Re: Розсылка сообщений клиентам  [new]
virtuOS
Member

Откуда: большая деревня
Сообщений: 266
shanton
У меня стоит задача показать текст сообщения клиенту на экран, аналогия net send.

Создайте оператора в разделе "Агент SQL Server" и используйте его для отправки уведомлений в джобах.

USE [msdb]
GO
EXEC msdb.dbo.sp_add_operator @name=N'User', 
		@enabled=1, 
		@weekday_pager_start_time=0, 
		@weekday_pager_end_time=235959, 
		@saturday_pager_start_time=0, 
		@saturday_pager_end_time=235959, 
		@sunday_pager_start_time=0, 
		@sunday_pager_end_time=235959, 
		@pager_days=127, 
		@netsend_address=N'192.168.1.1'
GO
26 май 15, 11:07    [17689669]     Ответить | Цитировать Сообщить модератору
 Re: Розсылка сообщений клиентам  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8823
shanton, в таком случае клиентское приложение может проверять - подписан ли документ.
26 май 15, 11:27    [17689775]     Ответить | Цитировать Сообщить модератору
 Re: Розсылка сообщений клиентам  [new]
shanton
Member

Откуда: Украина г. Хмельницкий
Сообщений: 628
Jaffar
shanton,

делать можно так и никаких сборок городить не нужно.
declare @STR varchar(8000)
select @STR = 'msg "192.168.01.01" "Подпиши Документ!!!"'
exec xp_cmdshell @STR --, no_output


END


У наc ОС на сервере Win Server 2003, и по моему msg там не работает. Пуск выполнить:
msg 192.168.0.33 Привет!

выдаёт ошибку:
192.168.0.33 does not exists or is disconnected
26 май 15, 11:33    [17689815]     Ответить | Цитировать Сообщить модератору
 Re: Розсылка сообщений клиентам  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
shanton
ALTER DATABASE DATD
SET TRUSTWORTHY ON
GO



17326545
26 май 15, 11:34    [17689816]     Ответить | Цитировать Сообщить модератору
 Re: Розсылка сообщений клиентам  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
+ 17326550
26 май 15, 11:34    [17689821]     Ответить | Цитировать Сообщить модератору
 Re: Розсылка сообщений клиентам  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
shanton
У наc ОС на сервере Win Server 2003, и по моему msg там не работает.
А почитать предложенную статью документации и выяснить как следует запускать msg совсем никак?
26 май 15, 11:58    [17689997]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить