1 (изменено: BANDI-OGA, 2013-11-21 06:27:44)

Тема: JS: Как запустить скрипт от другого пользователя

Подскажите, написал скрипт изменения системных переменных сред для пользователей. И теперь пытаюсь запустить из под другого пользователя, с правами администратора (например через runas) этот скрипт.
Мне выдает ошибку такого характера:
Сценарий: Wscript.js
Строка: 1
Символ: 1
Ошибка: Невозможно создание объекта сервером программирования объектов
Код: 800A01AD
Источник: Ошибка выполнения Microsoft JScript

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

Вот сам скрипт:


<html>
<head>
<META http-equiv='Content-Type' content='text/html; charset=windows-1251'>
<title>XXX</title>
<HTA:APPLICATION
  APPLICATIONNAME="Environment"
  ID="Environment"
  VERSION="0.01"
  BORDER="dialog"
  SYSMENU="yes"
  MAXIMIZEBUTTON="no"
  ICON="UnLockUser.ico"
  SCROLL="no"
  CONTEXTMENU="no"
  SELECTION="no"/>
</head>

<script language="VBScript">

Dim oShell, oEnv, NewEnvROOT, NewEnvPATH, tbUserROOT, tbUserPATH

Sub Window_OnLoad
  window.resizeTo 300,170
    lngBias = GetTimeZoneBias
End Sub

Sub OnClickButtonbtMINROOT()
NewEnvROOT = UCase(Trim(tbUserROOT.Value))
Set oShell = WScript.CreateObject("WScript.Shell")
Set oEnv = oShell.Environment("SYSTEM")
oEnv("MIN_ROOT") = NewEnvROOT
End Sub

Sub OnClickButtonbtMINPATH()
NewEnvPATH = UCase(Trim(tbUserPATH.Value))
Set oShell = WScript.CreateObject("WScript.Shell")
Set oEnv = oShell.Environment("SYSTEM")
oEnv("MIN_PATH") = NewEnvPATH
End Sub

</script>

<SCRIPT language='JavaScript' type='text/javascript'><!--
var WScript=null;
var IE=new ActiveXObject("InternetExplorer.Application");
IE.Navigate("about:blank");
// здесь не помешала бы проверка на IE.Busy==false,
// однако, метод WScript.Sleep() пока не доступен,
// а window.setTimeout() усложнило бы пример.
IE.Document.Script.name="mailbox";
IE.Document.Script.Callback=function (arg) {
  WScript=arg; IE.Quit();
};

var WshShell=new ActiveXObject("WScript.Shell");
WshShell.Run("WScript.js", 0);

onunload=function () {WScript.Quit()};
// --></SCRIPT>

<body bgcolor="white">

<table cellspacing=1 cellpadding=3 bgcolor="black">
    <tr>
        <td bgcolor="white">
            MIN_PATH <input type="text" name="tbUserPATH" id="User">
        </td>
        <td bgcolor="white">
            <input type="button" name="btGetInfo" id="btGetInfo" value="Применить" onclick="OnClickButtonbtMINPATH">        
        </td>
    </tr>
    <tr>
        <td bgcolor="white">
            MIN_ROOT <input type="text" name="tbUserROOT" id="User">
        </td>
        <td bgcolor="white">
            <input type="button" name="btGetInfo" id="btGetInfo" value="Применить" onclick="OnClickButtonbtMINROOT">        
        </td>
    </tr>
</table>
</body>
</html>

Вот скрипт, чтоб включить объект Wscript, ошибка возникает на нем, т.е. первый скрипт отрабатывает, появляется окно и потом затыкается на этом скрипте.


var ShellWindows=(new ActiveXObject("Shell.Application")).Windows();
for (var i=0; i<ShellWindows.Count; i++)
  try {
    var Script=ShellWindows.Item(i).Document.Script;
    if (Script.name=="mailbox") {
      Script.Callback(WScript);
      for (;;) WScript.Sleep(60000);
    }
  } catch (Err) {}

Читал эту ветку, но как то не помогло, или может, что-то не так сделал.
http://forum.script-coding.com/viewtopic.php?id=7262

2 (изменено: Евген, 2013-11-21 07:43:43)

Re: JS: Как запустить скрипт от другого пользователя

Вот не совсем втыкаю в затею...
т.е. у пользователя не хватает прав на смену своей переменной ? - тогда смысл её менять в учётке админа ? - она применительно к админу и замениться - НЕ ?
Мне кажется в этом случае надо пользователю дать права админа, потом сменить переменную и потом отобрать права админа, НЕ ?

Могу ошибаться, т.к. не было такой надобности...

Времени не хватает... :-(

3 (изменено: BANDI-OGA, 2013-11-21 08:14:31)

Re: JS: Как запустить скрипт от другого пользователя

Евген пишет:

Вот не совсем втыкаю в затею...
т.е. у пользователя не хватает прав на смену своей переменной ? - тогда смысл её менять в учётке админа ? - она применительно к админу и замениться - НЕ ?
Мне кажется в этом случае надо пользователю дать права админа, потом сменить переменную и потом отобрать права админа, НЕ ?

Могу ошибаться, т.к. не было такой надобности...

Ну как бы затея в том, что пользователю надо менять системные переменные постоянно, для работы специального ПО.
Так вот при смене системных переменных, они применяются для все пользователей в ОС. А если меняются пользовательские переменные, то только на того пользователя кому доступна эти пользовательские переменные.
Как бы, может я все усложнил и можно проще реализовать эту затею, но мне хотелось реализовать именно так и почти все получилось, кроме как запуск из под другого пользователя (под любым пользователем), выдает ошибку такого характера.

4 (изменено: Евген, 2013-11-21 10:20:29)

Re: JS: Как запустить скрипт от другого пользователя

Мне кажется тебе надо попробовать для начала запустить CMD'эшник или BAT'ник с кодом


SET MIN_ROOT=bla-bla-bla
SET MIN_PATH=bla-bla-bla

Если прав хватит у пользователя, то обрабатывать скриптом процесс логирования пользователей и пинать батник при нужных логинах...

Если же прав пользователя не хватит, то и думать нефик...

Не ?

Времени не хватает... :-(

5

Re: JS: Как запустить скрипт от другого пользователя

Евген пишет:

Мне кажется тебе надо попробовать для начала запустить CMD'эшник или BAT'ник с кодом


SET MIN_ROOT=bla-bla-bla
SET MIN_PATH=bla-bla-bla

Если прав хватит у пользователя, то обрабатывать скриптом процесс логирования пользователей и пинать батник при нужных логинах...

Если же прав пользователя не хватит, то и думать нефик...

Не ?

Прав пользователя на изменение системных переменных сред не хватает

6

Re: JS: Как запустить скрипт от другого пользователя

BANDI-OGA пишет:

Прав пользователя на изменение системных переменных сред не хватает

Значит закопать это надо всё поглубже...

Времени не хватает... :-(

7

Re: JS: Как запустить скрипт от другого пользователя

Евген пишет:
BANDI-OGA пишет:

Прав пользователя на изменение системных переменных сред не хватает

Значит закопать это надо всё поглубже...

что именно? мой скрипт?

8

Re: JS: Как запустить скрипт от другого пользователя

Ну да...

Времени не хватает... :-(

9 (изменено: Евген, 2013-11-21 20:17:59)

Re: JS: Как запустить скрипт от другого пользователя

Возможно я не прав !!!
Вообщем из под user'а "system", наверное, возможно изменить системную переменную.
Это можно сделать следующим образом, с помощью WMI в шедулере создать задание на присвоение значения этой переменной (Win32_Scheduler).
Кстати, здесь на форуме давненько видел такой пример, ребята баловались, так что всё в Ваших руках коллега))

Времени не хватает... :-(

10

Re: JS: Как запустить скрипт от другого пользователя

Евген пишет:

Возможно я не прав !!!
Вообщем из под user'а "system", наверное, возможно изменить системную переменную.
Это можно сделать следующим образом, с помощью WMI в шедулере создать задание на присвоение значения этой переменной (Win32_Scheduler).
Кстати, здесь на форуме давненько видел такой пример, ребята баловались, так что всё в Ваших руках коллега))

не можете мне немного помочь, а то я только начинаю изучать) не могу понять в какую сторону двигаться)

11

Re: JS: Как запустить скрипт от другого пользователя

Постараюсь на мысль натолкнуть поподробнее...
Вообщем есть такой WMI класс Win32_Scheduler, который может в назначенных заданиях (Планировщике)  создавать задачи от имени пользователя "system" - думаю это как раз то, что тебе надо. И давным-давно здесь же на форуме я видел что ребята тоже решали такую же задачу, что надо было в определённое время запускать задачу в шедулере от имени пользователя "system" и они там как-то научились высчитывать время как-то так, что получалось (сейчас+1 секунда) (если не вру), т.е. и тебе надо так же попробовать.
Согдать LOGON скрипт, в котором проверяется логин входящего пользователя, потом если логин из списка в котором нужно менять переменную, то в шедулере создаётся задание, которое срабатывает через 1 секунду после процесса логирования, а уже в задании шедулера будет исполняться твой скрипт по смене системной переменной.


Но для начала попробуй запустить скажем FAR-manager из шедулера от имени пользователя "system" (пароль пустой), потом в Far'е запустить твой скрипт и проверить сменилась ли переменная у пользователя.

Времени не хватает... :-(

12

Re: JS: Как запустить скрипт от другого пользователя

Евген пишет:

Постараюсь на мысль натолкнуть поподробнее...
Вообщем есть такой WMI класс Win32_Scheduler, который может в назначенных заданиях (Планировщике)  создавать задачи от имени пользователя "system" - думаю это как раз то, что тебе надо. И давным-давно здесь же на форуме я видел что ребята тоже решали такую же задачу, что надо было в определённое время запускать задачу в шедулере от имени пользователя "system" и они там как-то научились высчитывать время как-то так, что получалось (сейчас+1 секунда) (если не вру), т.е. и тебе надо так же попробовать.
Согдать LOGON скрипт, в котором проверяется логин входящего пользователя, потом если логин из списка в котором нужно менять переменную, то в шедулере создаётся задание, которое срабатывает через 1 секунду после процесса логирования, а уже в задании шедулера будет исполняться твой скрипт по смене системной переменной.


Но для начала попробуй запустить скажем FAR-manager из шедулера от имени пользователя "system" (пароль пустой), потом в Far'е запустить твой скрипт и проверить сменилась ли переменная у пользователя.

Ой, спасибо, как все понятно расписали) теперь есть направление) буду решать задачу

13

Re: JS: Как запустить скрипт от другого пользователя

new ActiveXObject("Shell.Application")
Попробуйте создайть профиль (рабочий стол) для пользователя под которым будете запускать скрипт.

14 (изменено: BANDI-OGA, 2013-11-25 06:09:02)

Re: JS: Как запустить скрипт от другого пользователя

badik пишет:

new ActiveXObject("Shell.Application")
Попробуйте создайть профиль (рабочий стол) для пользователя под которым будете запускать скрипт.

создан профиль, под ним заходил сначала, т.е. создал его, а потом из под него запускал но на другом профиле

15

Re: JS: Как запустить скрипт от другого пользователя

можно такой вопрос, как можно по другому включить объект - "WScript"

16

Re: JS: Как запустить скрипт от другого пользователя

На форуме есть такое решение
1.Запускаем скрипт  (CScript myscript.js)
2. скрипт создает диалоговое окно hta и подписывется на события
см WSH: создание окна, а также трансляция WScript в HTA

17 (изменено: BANDI-OGA, 2013-11-27 07:50:01)

Re: JS: Как запустить скрипт от другого пользователя

badik пишет:

На форуме есть такое решение
1.Запускаем скрипт  (CScript myscript.js)
2. скрипт создает диалоговое окно hta и подписывется на события
см WSH: создание окна, а также трансляция WScript в HTA

Подскажите, как реализовать? т.к. что то не могу додумать сие со своим скриптом

18 (изменено: BeS Yara, 2013-11-28 10:14:18)

Re: JS: Как запустить скрипт от другого пользователя

BANDI-OGA пишет:

Ну как бы затея в том, что пользователю надо менять системные переменные постоянно, для работы специального ПО.
Так вот при смене системных переменных, они применяются для все пользователей в ОС. А если меняются пользовательские переменные, то только на того пользователя кому доступна эти пользовательские переменные.

Если я правильно понял задачу, то имеется некоторая программа часть настроек которой меняется и задаётся с помощью переменных окружения(сталкивался с таким при использовании Unigraphics). При установке программы эти переменные создаются как системные. Системные переменные менять/создавать могут только администраторы(и это правильно).
Задача: дать возможность пользователю изменять эти переменные.

Так вот, если описал я задачу верно, то всё гораздо проще чем кажется.
Допустим есть системная переменная MyParam=MouseInvertTrue. Логинимся под пользователем, создаём(в свойствах системы) пользовательскую переменную с тем же именем и присваиваем ей нужное для пользователя значение, например MyParam=MouseInvertFalse. Всё! теперь в среде пользователя MyParam=MouseInverFalse. Самое забавное, это работает и с системными переменными ОС(пробовал на OS, PATHEXT). Для PATH поведение более логичное - пользовательский PATH приплюсуюется к системному.

Если нужно задавать переменную из скрипта, хотя заданные ручками переменные сохраняются при перезагрузке(кстати, лежат в HKCU\Environment), то тоже всё прозрачно - вместо oShell.Environment("SYSTEM") используем oShell.Environment("USER"). Вот только не уверен по поводу области действия, возможно переменная как и в случае батника будет действовать в пределах данного процесса.

В случае батника сработает только для данного окна CMD.
____________________________
Проверил, через скрипт переменные создаются/меняются в рамках всего профиля пользователя.

19

Re: JS: Как запустить скрипт от другого пользователя

BeS Yara пишет:
BANDI-OGA пишет:

Ну как бы затея в том, что пользователю надо менять системные переменные постоянно, для работы специального ПО.
Так вот при смене системных переменных, они применяются для все пользователей в ОС. А если меняются пользовательские переменные, то только на того пользователя кому доступна эти пользовательские переменные.

Если я правильно понял задачу, то имеется некоторая программа часть настроек которой меняется и задаётся с помощью переменных окружения(сталкивался с таким при использовании Unigraphics). При установке программы эти переменные создаются как системные. Системные переменные менять/создавать могут только администраторы(и это правильно).
Задача: дать возможность пользователю изменять эти переменные.

Так вот, если описал я задачу верно, то всё гораздо проще чем кажется.
Допустим есть системная переменная MyParam=MouseInvertTrue. Логинимся под пользователем, создаём(в свойствах системы) пользовательскую переменную с тем же именем и присваиваем ей нужное для пользователя значение, например MyParam=MouseInvertFalse. Всё! теперь в среде пользователя MyParam=MouseInverFalse. Самое забавное, это работает и с системными переменными ОС(пробовал на OS, PATHEXT). Для PATH поведение более логичное - пользовательский PATH приплюсуюется к системному.

Если нужно задавать переменную из скрипта, хотя заданные ручками переменные сохраняются при перезагрузке(кстати, лежат в HKCU\Environment), то тоже всё прозрачно - вместо oShell.Environment("SYSTEM") используем oShell.Environment("USER"). Вот только не уверен по поводу области действия, возможно переменная как и в случае батника будет действовать в пределах данного процесса.

В случае батника сработает только для данного окна CMD.
____________________________
Проверил, через скрипт переменные создаются/меняются в рамках всего профиля пользователя.

Спасибо за ответ, наверное так и сделаю.