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

Откуда:
Сообщений: 9
Добрый день!
Скрипт будет использоваться в триггере для журнализации изменений реквизитов
Нужно получить имя владельца процесса. Код процесса будет заранее известен через Host_ID()
suser_sname() не катит = вход на скл сервер выполняется через sa. Windows аутентификация не рассматривается.

Создал скрипт но не запускается, выдает ошибку уже на sp_OACreate

error create -2147221005
Description: Invalid class string

Гугл не помог. Мож я плохо просил. Подскажите плз или дайте где копнуть?

sp_configure 'show advanced options', 1 reconfigure
go
sp_configure 'Ole Automation Procedures', 1 reconfigure
go

declare @script_text varchar(8000), @object int, @hr int
Declare @Res Table(PID int, UserName VarChar)
Declare @output varchar(255)
Declare @source varchar(255)
Declare @description varchar(255)

set @script_text = '
function Main() 
		Dim ServicesSet
		Dim Items
		Dim strOwner, strDomain, colProps
		Dim iter
		Redim tabprocesses(1, -1)	

		iter = 0
	
    	Set ServicesSet = GetObject("winmgmts:")
    	Set Items = ServicesSet.ExecQuery("Select * from Win32_Process WHERE Name like ''1Cv7%''")
    	For Each Item in Items
			
			colProps = Item.getowner(strOwner, strDomain)	
			
			tabprocesses(0, iter) = strOwner 
			tabprocesses(1, iter) = Item.ProcessId

			iter = iter + 1
		Next
		

	Main = tabprocesses
	
end function'

exec @hr = sp_OACreate 'MSScriptControl.ScriptControl', @object out
IF @HR <> 0 
BEGIN	
	print 'error create '+cast(@hr as varchar)+')'
	EXEC @HR = sp_OAGetErrorInfo @object, @source OUT, @description OUT
	IF @HR = 0 
	BEGIN
		SELECT @output = ' Description: '+@description
		PRINT @output
		RETURN
	END
END

exec @hr = sp_OASetProperty @object, 'Language',  'VBScript' 
IF @HR <> 0 
BEGIN	
	print 'error language '+cast(@hr as varchar)+')'
	EXEC @HR = sp_OAGetErrorInfo @object, @source OUT, @description OUT
	IF @HR = 0 
	BEGIN
		SELECT @output = ' Description: '+@description
		PRINT @output
		RETURN
	END
END

exec @hr = sp_OAMethod @object, 'AddCode', NULL, @script_text
IF @HR <> 0 
BEGIN	
	print 'error add code '+cast(@hr as varchar)+')'
	EXEC @HR = sp_OAGetErrorInfo @object, @source OUT, @description OUT
	IF @HR = 0 
	BEGIN
		SELECT @output = ' Description: '+@description
		PRINT @output
		RETURN
	END
END


insert @Res exec @hr = sp_OAMethod @object, 'Run', null, 'Main'
IF @HR <> 0 
BEGIN	
	print 'error insert '+cast(@hr as varchar)+')'
	EXEC @HR = sp_OAGetErrorInfo @object, @source OUT, @description OUT
	IF @HR = 0 
	BEGIN
		SELECT @output = ' Description: '+@description
		PRINT @output
		RETURN
	END
END

exec @hr = sp_OADestroy @object
IF @HR <> 0 
BEGIN	
	print 'error create '+cast(@hr as varchar)+')'
	EXEC @HR = destroy @object, @source OUT, @description OUT
	IF @HR = 0 
	BEGIN
		SELECT @output = ' Description: '+@description
		PRINT @output
		RETURN
	END
END

select * from @Res
26 ноя 12, 15:30    [13530280]     Ответить | Цитировать Сообщить модератору
 Re: хочу получить список процессов с именами их владельцев (входят через терминал)  [new]
madyka
Member

Откуда:
Сообщений: 9
Упс, забыл уточнить - Win 2003 + SQL 2005
26 ноя 12, 15:38    [13530356]     Ответить | Цитировать Сообщить модератору
 Re: хочу получить список процессов с именами их владельцев (входят через терминал)  [new]
Glory
Member

Откуда:
Сообщений: 104751
madyka
Упс, забыл уточнить - Win 2003 + SQL 2005

приводите select @@version
26 ноя 12, 15:46    [13530447]     Ответить | Цитировать Сообщить модератору
 Re: хочу получить список процессов с именами их владельцев (входят через терминал)  [new]
madyka
Member

Откуда:
Сообщений: 9
Microsoft SQL Server 2005 - 9.00.4053.00 (X64) May 26 2009 14:13:01 Copyright (c) 1988-2005 Microsoft Corporation Standard Edition (64-bit) on Windows NT 5.2 (Build 3790: Service Pack 2)
26 ноя 12, 16:11    [13530736]     Ответить | Цитировать Сообщить модератору
 Re: хочу получить список процессов с именами их владельцев (входят через терминал)  [new]
madyka
Member

Откуда:
Сообщений: 9
Как вариант пробовал с другим кодом:

Но выдает ошибку на попытке получить хотя бы первую строчку коллекции (item), только учусь с ней работать. не получается ((

-2147217407
SQL error (Item): Generic failure


SET NOCOUNT ON
--use Master
go
sp_configure 'show advanced options', 1 
go
reconfigure
go
sp_configure 'Ole Automation Procedures', 1 
go
reconfigure
go

GRANT EXECUTE ON [sys].[sp_OACreate] TO [public]
GRANT EXECUTE ON [sys].[sp_OAGetErrorInfo] TO [public]
GRANT EXECUTE ON [sys].[sp_OAGetProperty] TO [public]
GRANT EXECUTE ON [sys].[sp_OASetProperty] TO [public]
GRANT EXECUTE ON [sys].[sp_OAMethod] TO [public]
GRANT EXECUTE ON [sys].[sp_OAStop] TO [public]
GRANT EXECUTE ON [sys].[sp_OADestroy] TO [public]

go

Declare @ResRecordSet int
Declare @ItemRecordSet int
Declare @HR int
Declare @Object int
Declare @service int
Declare @command varchar(255)
Declare @output varchar(255)
Declare @source varchar(255)
Declare @description varchar(255)
Declare @Res Table(PID int, UserName VarChar)
Declare @Count Int

Declare @UserName Varchar
Declare @ProcessID int

-- создаем обїект
Exec @HR = sp_OACreate 'wbemScripting.SwbemLocator', @object OUT
IF @HR <> 0 
BEGIN	
	EXEC @HR = sp_OAGetErrorInfo @object, @source OUT, @description OUT
	IF @HR = 0 
	BEGIN
		SELECT @output = ' Description: '+@description
		PRINT @output
	END
END
/*
-- установка настроек доступа
Exec @HR = sp_OASetProperty @object, 'Security_.ImpersonationLevel', 1
IF @HR <> 0 
BEGIN
	EXEC @HR = sp_OAGetErrorInfo @object, @source OUT, @description OUT
	IF @HR = 0 
	BEGIN
		SELECT @output = ' Security error: '+@description
		PRINT @output
	END
END 
*/

-- подключаемся
Exec @HR = sp_OAMethod @object, 'ConnectServer', @service OUT, '.','root\cimv2'
IF @HR <> 0 
BEGIN
	EXEC @HR = sp_OAGetErrorInfo @object, @source OUT, @description OUT
	IF @HR = 0 
	BEGIN
		SELECT @output = ' Service error: '+@description
		PRINT @output
		RETURN 
	END
END

--drop table ##tmpRes
--Create Table ##tmpRes1 (UserName Varchar, ProcessID int)
--Insert Into #tmpRes

Select @Command = 'Select Name, ProcessID From Win32_Process WHERE Name Like ''1cv7%''' --ProcessID = '+CAST(Host_id() as varchar)

EXEC @HR = sp_OAMethod @service, 'ExecQuery', @ResRecordSet OUT, @command
IF @HR <> 0 
BEGIN
	EXEC @HR = sp_OAGetErrorInfo @object, @source OUT, @description OUT
	IF @HR = 0 
	BEGIN
		SELECT @output = ' SQL error: '+@description
		PRINT @output
		RETURN
	END
END


EXEC @HR = sp_OAGetProperty @ResRecordSet, 'Count', @Count OUT
IF @HR = 0 
	Select @HR, @Count as Count 
ELSE
BEGIN
	EXEC @HR = sp_OAGetErrorInfo @object, @source OUT, @description OUT
	IF @HR = 0 
	BEGIN
		SELECT @output = ' SQL error (Count): '+@description
		PRINT @output
		RETURN
	END
END


EXEC @HR = sp_OAGetProperty @ResRecordSet, 'Item', @ItemRecordSet OUTPUT, 1 
IF @HR = 0 
	Select @HR, @ItemRecordSet as Item
ELSE
BEGIN
	PRINT @HR
	EXEC @HR = sp_OAGetErrorInfo @object, @source OUT, @description OUT
	IF @HR = 0 
	BEGIN
		SELECT @output = ' SQL error (Item): '+@description
		PRINT @output
		RETURN
	END
END

PRINT 'Succesfully perfomed'
/*
EXEC @HR = sp_OAGetProperty @ItemRecordSet, 'UserName', @UserName OUT
IF @HR <> 0 
BEGIN
	EXEC @HR = sp_OAGetErrorInfo @object, @source OUT, @description OUT
	IF @HR = 0 
	BEGIN
		SELECT @output = ' SQL error (Username): '+@description
		PRINT @output
	END
END
Else Select @HR, @UserName as UserName
*/
/*
EXEC @HR = sp_OAGetProperty @ResRecordSet, 'Item', @ItemRecordSet OUT, 'Win32_Process'

EXEC @HR = sp_OAGetProperty @ItemRecordSet, 'Name', @UserName OUT
Select @UserName
Print 'User - '+@UserName

EXEC @HR = sp_OAGetProperty @ItemRecordSet, 'ProcessID', @ProcessID OUT
Select @ProcessID
Print 'PID - '+Cast(@ProcessID as varchar) 
*/
--EXEC @HR = sp_OAGetProperty @ResRecordSet, 'Item'
--Print @ResRecordSet

--Select * From #tmpRes

/*
Select @Command = '"Select CSName From Win32_Process"'

drop table #tmpRes
Create Table #tmpRes (ServiceName VARCHAR(255))

insert into #tmpRes 
EXEC @HR = sp_OAMethod @object, @command
IF @HR <> 0 
BEGIN
	EXEC @HR = sp_OAGetErrorInfo @object, @source OUT, @description OUT
	IF @HR = 0 
	BEGIN
		SELECT @output = ' SQL error: '+@description
		PRINT @output
	END
END


*/
EXEC sp_OADestroy @object
EXEC sp_OADestroy @source
EXEC sp_OADestroy @service
EXEC sp_OADestroy @object
26 ноя 12, 16:13    [13530760]     Ответить | Цитировать Сообщить модератору
 Re: хочу получить список процессов с именами их владельцев (входят через терминал)  [new]
madyka
Member

Откуда:
Сообщений: 9
Пробую сейчас 2й вариант (через 'wbemScripting.SwbemLocator')
Возвращает мне коллекцию типа SwbemObjectSet (по крайней мере sp_OAGetProperty "Count" возвращает значение 16...20, в зависимости от того сколько реально 1с-ок запущено.
А как по данной коллекции пройтись пытаюсь найти примеры (похожий пример в этой теме)
26 ноя 12, 17:39    [13531548]     Ответить | Цитировать Сообщить модератору
 Re: хочу получить список процессов с именами их владельцев (входят через терминал)  [new]
madyka
Member

Откуда:
Сообщений: 9
Может ли относиться ошибка "Invalid class string" к правам доступа DCOM для MSScriptControl?
26 ноя 12, 23:36    [13533226]     Ответить | Цитировать Сообщить модератору
 Re: хочу получить список процессов с именами их владельцев (входят через терминал)  [new]
aleks2
Guest
madyka
Может ли относиться ошибка "Invalid class string" к правам доступа DCOM для MSScriptControl?

Я, конешно, понимаю, что изобретение непромокаемого пороха - вещь самоценная и увлекательная.

НО! Тибе, дарагуля, ничо не светит. Разве ты только всеже "рассмотришь" Windows аутентификацию...
27 ноя 12, 05:31    [13533669]     Ответить | Цитировать Сообщить модератору
 Re: хочу получить список процессов с именами их владельцев (входят через терминал)  [new]
invm
Member

Откуда: Москва
Сообщений: 9823
Если соединятся с сервером по Named pipes, то и при сиквельной аутентификации можно будет извлечь требуемые данные из sysprocesses.
27 ноя 12, 09:36    [13534110]     Ответить | Цитировать Сообщить модератору
 Re: хочу получить список процессов с именами их владельцев (входят через терминал)  [new]
madyka
Member

Откуда:
Сообщений: 9
чувствую что получаю нужные результаты, но как же получить данные из коллекции??

EXEC @HR = sp_OAGetProperty @ResRecordSet, 'Item', @ItemreocordSet OUT, 1, '<что нужно писать тут???>'

вызывает ошибку -2147352571 (Type mismatch)
27 ноя 12, 13:48    [13535992]     Ответить | Цитировать Сообщить модератору
 Re: хочу получить список процессов с именами их владельцев (входят через терминал)  [new]
madyka
Member

Откуда:
Сообщений: 9
UP!
Неужели никто не работал с swbemObjectSet и вообще с sp_OAxxxx?
29 ноя 12, 01:21    [13546854]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить