Войти

Показать полную графическую версию : [решено] Экранизация кавычек в передаваемом аргументе в скрипт


yanus74
11-12-2015, 08:07
Здравствуйте! Вот такой вот скрипт, призван вызывать из контекстного меню оснастки AD "пользователи и компьютеры" программу для удаленного подключение к компьютеру пользователя, но в передаваемом аргументе есть кавычки, которые в AD экранируются с помощью символа \". А в vbs, это вызывает проблемы (
Подскажите как в этой ситуации выкрутится.

On Error Resume Next
Set WshShell = CreateObject("WScript.Shell")
set fs=createobject("Scripting.FileSystemObject")
Dim CompName
Dim RunCMD
Dim FilePath
Set objUser = GetObject(Wscript.arguments.Item(0))
CompName = objUser.Get ("wWWHomePage")
If CompName = "" Then WScript.Echo "CompName= " & Wscript.arguments.Item(0)
If CompName = "" Then WScript.quit
If MsgBox ("Подключиться к компьютеру " & CompName & "?",vbOKCancel+vbQuestion,"Серьезно?") = vbCancel Then WScript.quit
If fs.FileExists ("\\dc\NETLOGON\ultravnc\vncviewer.exe") Then FilePath = """\\dc\NETLOGON\ultravnc\vncviewer.exe"""

RunCMD = FilePath & CompName
RetCode = WshShell.Run (RunCMD,5)

Iska
11-12-2015, 08:51
Подскажите как в этой ситуации выкрутится. »
Как минимум, для начала убрать «On Error Resume Next» и добавить «Option Explicit» вкупе с объявлением всех используемых переменных. Затем добавить перед последней командой «WScript.Echo RunCMD», запустить, посмотреть, удивиться и добавить пробел между переданным на исполнение файлом и его параметром. Если всё ещё не заработает, нажать в окне, выведенном командой «WScript.Echo RunCMD», комбинацию клавиш «Ctrl-C» и вставить полученный текст из буфера обмена сюда.

yanus74
11-12-2015, 09:12
Option Explicit »
Это да, но вопрос в другом. В скрипт передается DN объекта в виде: LDAP://DC.office.zmzgroup.ru/CN=Иванов Иван Иванович,OU=ООО \"Наша Контора\",OU=Пользователи,DC=office,DC=zmzgroup,DC=ru user

в результате, получается уже не два переданных аргумента, а 3:
LDAP://DC.office.zmzgroup.ru/CN=Иванов Иван Иванович,OU=ООО \Наша
Контора\,OU=Пользователи,DC=office,DC=zmzgroup,DC=ru
user

При этом пропадает символ ". Если между \" и \" еще больше пробелов, то количество аргументов становится еще больше.

получается, нужно сделать переменную, в которую циклом будут записываться все аргументы пока не встретится аргумент user.

и потом, еще нужно вставить символ " после \, и передать все это в GetObject.

Но как это все реализовать, я не знаю(

Iska
11-12-2015, 11:38
yanus74, покажите, как именно у Вас вызов скрипта организован, как привязка:
скрипт, призван вызывать из контекстного меню оснастки AD "пользователи и компьютеры" »
сделана — я навскидку не помню сейчас деталей реализации.

yanus74
11-12-2015, 11:39
вот эта конструкция решает проблему с пробелами:
Set objArgs = WScript.Arguments
Dim LDAPPath
For i = 0 to objArgs.Count - 1
if objArgs(i) <> "user" Then LDAPPath=LDAPPath & " " & objArgs(i)
Next
Осталось понять, как добавить в эту строковую переменную, в нужное место, символ "

как именно у Вас вызов скрипта организова »
по этой статье http://habrahabr.ru/post/192818/

Iska
11-12-2015, 12:07
С моей колокольни, самым правильным будет заменить в свойствах объекта AD прямые кавычки на типографские («ёлочки») или апострофы:
ООО «Наша Контора»
ООО 'Наша Контора'
Ибо жёппа из-за кавычек будет не только в этом месте.

по этой статье http://habrahabr.ru/post/192818/ »
Я так и думал :).

yanus74
11-12-2015, 12:20
С моей колокольни, самым правильным будет заменить в свойствах объекта AD прямые кавычки на типографские («ёлочки») или апострофы: »
Это простое решение, я к нему пришел сразу, как столкнулся с проблемой.

А по скрипту, я так понял, нужно сделать функцию, которая посчитает количество \ ( гугление показало, что такой функции в VBS нету ), потом сделать цикл, который разложит строку, и после каждого встреченного символа \ добавит Chr(34). И потом уже вызвать функцию GetObject в которую передать переменную.

Из простого скрипта целая программа выходит)

Iska
11-12-2015, 13:42
А по скрипту, я так понял, нужно сделать функцию, которая »
yanus74, извращение всё это. Переданный параметр, как и положено, обрамляется кавычками, посему любые «внутренние» кавычки в аргументе будут восприняты некорректно.

гугление показало, что такой функции в VBS нету »
Можно так:
WScript.Echo UBound(Split("12345\67890\qwerty\uiop\asdf", "\"))




© OSzone.net 2001-2012