Гость
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Выполнение скрипта / 19 сообщений из 19, страница 1 из 1
23.04.2018, 14:45
    #39634802
AndrF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение скрипта
Хочу немного автоматизировать настройку конфигураций SQL-сервера.

На одном из этапов из моей программы на VB6 нужно поменять всего лишь два параметра. В принципе, это успешно делает приведенный ниже скрипт VBS. Но проблема в том что перетащить данный код в VB6 я не могу - он повалится по ошибке.

Попытка же выполнить данный скрипт из VB6 "cscript C:\MyPath\chPort.vbs" (или "cmd /k cscript C:\MyPath\chPort.vbs" чтобы увидеть строку с ошибкой) приводит к ошибке. Любыми методами - Shell, CreateProcess...

Понятно что тут проблема возникает из-за прав. Тот же Far (запущенный от имени Администратора) его прекрасно выполняет...

В общем, кто сталкивался с подобным - подскажите решение...

Собственно скрипт ( взятый отсюда ):

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
'This script can be used to change the TCP Port of the a SQL Server instance using SQL Server WMI Namespace

'Specify the computer name in the parameter below. Default is local server.

strComputer = "." 

'Specify the instance name if any. Default is MSSQLSERVER.
'Assumption is that we are running this for the default instance. 
'For a named instance, only provide the instance name. Eg: For a named instance LABDC\INST1, the parameter below would be strInstance = "INST1"
'For a cluster, we need to run this script on the active node.

strInstance = "KATMAI"

'Specify the new PORT 

strPort = "1434"

'Parameter to store the current Port Value
Dim strCurrPort

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\Microsoft\SqlServer\ComputerManagement10") 
Set colItems = objWMIService.ExecQuery( _
    "SELECT * FROM ServerNetworkProtocolProperty WHERE ProtocolName = 'Tcp' AND InstanceName = '"&strInstance&"' AND PropertyName = 'TcpPort' AND IPAddressName = 'IPAll'",,48) 
For Each objItem in colItems 
    Wscript.Echo "-----------------------------------"
    Wscript.Echo "    TCP Port Setting for IP ALL    "
    Wscript.Echo "-----------------------------------"
    Wscript.Echo "TCP Port Value: " & objItem.PropertyStrVal
    Wscript.Echo "ProtocolName: " & objItem.ProtocolName
Next

' Obtain an instance of the the class 
' using a key property value.
Set objShare = objWMIService.Get("ServerNetworkProtocolProperty.InstanceName='"&strInstance&"',IPAddressName='IP1',PropertyName='TcpPort',PropertyType='1',ProtocolName='Tcp'")

' Obtain an InParameters object specific
' to the method.
Set objInParam = objShare.Methods_("SetStringValue"). _
    inParameters.SpawnInstance_()

' Add the new TCP Port here.
objInParam.Properties_.Item("StrValue") =  strPort

' Execute the method and obtain the return status.
' The OutParameters object in objOutParams
' is created by the provider.
Set objOutParams = objWMIService.ExecMethod("ServerNetworkProtocolProperty.InstanceName='"&strInstance&"',IPAddressName='IPAll',PropertyName='TcpPort',PropertyType='1',ProtocolName='Tcp'", "SetStringValue", objInParam)

Wscript.Echo ""

'List success/failure
If (objOutParams.ReturnValue = 0) Then 

Wscript.Echo "TCP Port changed SUCCESSFULLY changed for instance : " & strInstance 
Set colItems = objWMIService.ExecQuery( _
    "SELECT * FROM ServerNetworkProtocolProperty WHERE ProtocolName = 'Tcp' AND InstanceName = '"&strInstance&"' AND PropertyName = 'TcpPort' AND IPAddressName = 'IPAll'",,48) 
For Each objItem in colItems 
    Wscript.Echo ""
    Wscript.Echo "------------------------------------------------------------"
    Wscript.Echo "  NEW TCP Port Setting for IP ALL         :"& objItem.PropertyStrVal
    Wscript.Echo "------------------------------------------------------------"
Next

' Execute the method and obtain the return status.
' Change the TCP Dynamic Ports to blank to avoid startup issues

' Change the input paramter to blank
objInParam.Properties_.Item("StrValue") =  ""

Set objOutParams = objWMIService.ExecMethod("ServerNetworkProtocolProperty.InstanceName='"&strInstance&"',IPAddressName='IPAll',PropertyName='TcpDynamicPorts',PropertyType='1',ProtocolName='Tcp'", "SetStringValue", objInParam)

Wscript.Echo ""
If (objOutParams.ReturnValue = 0) Then 
Wscript.Echo "TCP Dynamic Port changed SUCCESSFULLY changed for instance : " & strInstance 
Wscript.Echo "SQL Services need to be restarted for the changes to take effect." 
End If

If (objOutParams.ReturnValue > 0 OR objOutParams.ReturnValue < 0) Then Wscript.Echo "TCP Dynamic Port change UNSUCCESSFUL for instance : " & strInstance End If      

End If

If (objOutParams.ReturnValue > 0 OR objOutParams.ReturnValue < 0) Then Wscript.Echo "TCP Port change UNSUCCESSFUL for instance : " & strInstance End If   
...
Рейтинг: 0 / 0
23.04.2018, 14:48
    #39634805
AndrF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение скрипта
P.S
Само-собой, что все нужные мне значения я в скрипт подставляю...
...
Рейтинг: 0 / 0
23.04.2018, 14:50
    #39634807
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение скрипта
AndrFон повалится по ошибке.AndrFприводит к ошибке
ошибки нам нужно угадать?
...
Рейтинг: 0 / 0
23.04.2018, 14:52
    #39634808
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение скрипта
Код: vbnet
1.
2.
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
ShellExecute 0, "runas", App.Path & "\my.exe", Command, vbNullString, 3



manifest file:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
     <assemblyIdentity version="1.0.0.0"
	processorArchitecture="X86"
	name="ExeName"
	type="win32"/>
 <description>elevate execution level</description>
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> 
     <security>
         <requestedPrivileges>
            <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
         </requestedPrivileges>
      </security>
   </trustInfo>
</assembly>
...
Рейтинг: 0 / 0
23.04.2018, 14:59
    #39634815
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение скрипта
вариант с диалогом

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
Set objShell = CreateObject("Shell.Application")
Set FSO = CreateObject("Scripting.FileSystemObject")
strPath = FSO.GetParentFolderName (WScript.ScriptFullName)
If FSO.FileExists(strPath & "\MAIN.VBS") Then
     objShell.ShellExecute "wscript.exe", _
        Chr(34) & strPath & "\MAIN.VBS" & Chr(34), "", "runas", 1
Else
     MsgBox "Script file MAIN.VBS not found"
End If
...
Рейтинг: 0 / 0
23.04.2018, 15:08
    #39634820
AndrF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение скрипта
Konst_One[src vba]
manifest file

Спасибо. Возможно оно. Попробую.
...
Рейтинг: 0 / 0
24.04.2018, 12:39
    #39635279
AndrF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение скрипта
К сожалению, ни один из вариантов не сработал.

Собственно, сам VB я до этого запускал с правами админа, но в варианте запуска скрипта из программы оно не помогает. Можно было бы попробовать работу со скрипт-контролом, но мне этот вариант не подходит - нужно чтобы программа выполнялась на компе без установленных компонентов.

В принципе, нужного можно было бы достичь и записью в реестр вот этой информации (номера портов - чисто отладочные):

Код: sql
1.
2.
3.
4.
5.
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL14.INST1\MSSQLServer\SuperSocketNetLib\Tcp\IPAll]
"TcpPort" = "20"
"TcpDynamicPorts"="50220"



Но опять-же при попытке писать в эту ветку - облом. Как и при попытке запуска из программы reg-файла - все так же срабатывает UAC... Хотя с Far-ом все прекрасно выполняется...
...
Рейтинг: 0 / 0
24.04.2018, 12:43
    #39635283
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение скрипта
система x64?
тогда руками запускайте от имени админа cmd.exe из папки c:\windows\system32 и выполняйте reg-файл
...
Рейтинг: 0 / 0
24.04.2018, 12:44
    #39635286
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение скрипта
и пишите инструкцию для запуска
...
Рейтинг: 0 / 0
24.04.2018, 13:38
    #39635362
AndrF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение скрипта
Да, 64x. Пока, видимо, так и придется - по окончании работы утилиты вручную запускать сформированный ею файл, чтобы доделать остатки... Криво, конечно, но иначе пока не удается.
...
Рейтинг: 0 / 0
25.04.2018, 17:31
    #39636254
AndrF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение скрипта
Путем перебора вариантов нашел таки решение - нужно подключившись к нужному инстансу SQL-сервера выполнить на нем:

Код: sql
1.
2.
EXEC xp_instance_regwrite N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer\SuperSocketNetLib\Tcp\IPAll', N'TcpPort', REG_SZ, '1433'
EXEC xp_instance_regwrite N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer\SuperSocketNetLib\Tcp\IPAll', N'TcpDynamicPorts', REG_SZ, ''



Вот так все проходит - настройки портов SQL сервера изменяются на нужные!
...
Рейтинг: 0 / 0
04.05.2018, 15:03
    #39640107
AndrF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение скрипта
Все же не до конца протестировал в прошлый раз.

Да, настройки в реестре меняются на нужные. Однако сервис SQL-сервера потом не может рестартовать!

Вручную лечится элементарно - надо в редакторе реестра ручками найти нужную ветку, например:

Код: sql
1.
2.
3.
4.
5.
6.
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL14.INST1\MSSQLServer\SuperSocketNetLib\Tcp\IPAll]
"TcpPort"="1433"
"TcpDynamicPorts"=""
"DisplayName"="Any IP Address"



И в ней просто перезаписать значение TcpDynamicPorts - можно просто открыть его и, ничего не меняя, закрыть нажав на ОК. Само по себе значение TcpDynamicPorts не меняется, но после этого сервис начинает стартовать...

В общем, нет в жизни счастья - проблема остается нерешенной - я никак не могу корректно задать из своей программы значения портов SQL сервера, так чтобы потом все работало.

Ну неужто никто не делал подобного?
...
Рейтинг: 0 / 0
04.05.2018, 15:19
    #39640129
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение скрипта
обычно просто делают текстовую инструкцию по настройке программы
...
Рейтинг: 0 / 0
04.05.2018, 15:56
    #39640157
AndrF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение скрипта
Konst_Oneобычно просто делают текстовую инструкцию по настройке программы

Инструкция-то есть - из 20-и пунктов, которые нужно выполнить после установки SQL-сервера.

Но я хочу облегчить жизнь себе любимому - серверов по работе приходится ставить много. Ну дюже муторно проходить все пункты инструкции, при этом ничего не пропустив. На данный момент пока не удается победить два пункта инструкции - один из них в данном вопросе, а второй - создание и настройка Maintenance Plans.
...
Рейтинг: 0 / 0
04.05.2018, 16:04
    #39640165
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение скрипта
ищите powershell скрипты
...
Рейтинг: 0 / 0
04.05.2018, 17:06
    #39640238
AndrF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение скрипта
Konst_Oneищите powershell скрипты

Боюсь будет та же проблема что и VBS - при запуске из программы не хватит прав.
...
Рейтинг: 0 / 0
04.05.2018, 17:06
    #39640239
AndrF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение скрипта
Konst_Oneищите powershell скрипты

Боюсь будет та же проблема что и VBS - при запуске из программы не хватит прав.
...
Рейтинг: 0 / 0
04.05.2018, 17:32
    #39640268
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение скрипта
не надо из программы вызывать, надо из инсталлятора под админскими правами или ручками так же
...
Рейтинг: 0 / 0
04.05.2018, 23:35
    #39640471
AndrF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение скрипта
Konst_Oneне надо из программы вызывать, надо из инсталлятора под админскими правами или ручками так же

Люди, ну сколько можно!

Ну не прикладная эта программа, а чисто моя, с помощью которой я хочу автоматизировать одну из рутинных частей своей работы (которую вы предлагаете делать ручками!). Запускаю я ее с админскими правами, работать с реестром умею.

Но именно данная ветка реестра - дюже интересная. Я об нее уже все оставшиеся зубы обломал...
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Выполнение скрипта / 19 сообщений из 19, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]