Войти

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


Страниц : 1 [2] 3

Iska
23-03-2020, 21:34
Лично я от Вас первый раз в этой теме вижу этот код, »
Я имел в виду этот:
есть стандартный Prnmngr.vbs (в XP/2003 - в папке \WINDOWS\system32, в последующих ОС - в папке \Windows\System32\Printing_Admin_Scripts\локаль). »
код.

можно или нет внутрь файла 1.vbs чего-то написать, чтобы файл 1.vbs запускался с парвами администратора? »
Нет. Внутрь скрипта ничего нельзя написать, чтобы он сам запускался с административными привилегиями. Вы можете запускать с административными привилегиями хост, исполняемый файл cscript.exe/wscript.exe, параметром которого будет скрипт.

Мне-то и незаметно было: я работаю из-под Far Manager'а, который запускаю с административными привилегиями, посему и все дочерние процессы, запущенные из-под него, также наследуют эти привилегии.

Попробуйте ещё такой код:
Option Explicit

Const wbemImpersonationLevelImpersonate = 3
Const wbemPrivilegeLoadDriver = 9

With WScript.CreateObject("WbemScripting.SWbemLocator").ConnectServer(".", "root\cimv2")
With .Security_
.ImpersonationLevel = wbemImpersonationLevelImpersonate
.Privileges.Add wbemPrivilegeLoadDriver
End With

On Error Resume Next
.Get("Win32_Printer.DeviceID='Epson Stylus C20 Series (M)'").Delete_
On Error Goto 0
End With

WScript.Quit 0

Если и он не будет удалять с обычными, не повышенными, привилегиями — то не знаю, у меня отрабатывает.

SharkyEXE
23-03-2020, 21:43
Я имел в виду этот: »
1) Я не понимаю, как из много текста Вы сделали мало - работает и славно
2) Этот код
Option Explicit

Const wbemImpersonationLevelImpersonate = 3
Const wbemPrivilegeLoadDriver = 9

With WScript.CreateObject("WbemScripting.SWbemLocator").ConnectServer(".", "root\cimv2")
With .Security_
.ImpersonationLevel = wbemImpersonationLevelImpersonate
.Privileges.Add wbemPrivilegeLoadDriver
End With

On Error Resume Next
.Get("Win32_Printer.DeviceID='Microsoft XPS Document Writer'").Delete_
On Error Goto 0
End With

WScript.Quit 0
Просто два раза мышкой - не удаляется, только командная строка с правами администратора + запуск файла
PS. Если выключить Контроль учетных записей (ползунок в самый вниз), перезагрузить компьютер, просто два раза мышкой - удаляется
PPS. Было бы замечательно, если не выключая Контроль учетных записей, просто два раза мышкой - удалялось бы или запрашивался Запуск от имени администратора, вылазила бы табличка

SharkyEXE
23-03-2020, 22:20
Может быть кому интересно, здесь перейти (http://moonlightsoft.blogspot.com/2014/04/vbscript_16.html) есть решение

Скрипт перейти (http://forum.oszone.net/post-2914404-19.html) с учетом этого решения (http://moonlightsoft.blogspot.com/2014/04/vbscript_16.html) - файл 1.vbs

Const DQ = """", HKLM = &H80000002, KQV = &H1, KSV = &H2
SET colOS = GetObject("winmgmts:\root\cimv2").ExecQuery("Select * from Win32_OperatingSystem")
FOR EACH oOS IN colOS
strOSLong = oOS.Version
NEXT
IF Left(strOSLong, 1) > "5" THEN
IF NOT isAdminRights THEN
SET oShellApp = CreateObject("Shell.Application")
oShellApp.ShellExecute WScript.FullName, DQ & WScript.ScriptFullName & DQ, "", "runas", 1
WScript.Quit
END IF
END IF
''''''''''Begin of code''''''''''''''''''''''''''''''

' Option Explicit

On Error Resume Next

WScript.CreateObject("WbemScripting.SWbemLocator").ConnectServer(".", "root\cimv2").Get("Win32_Printer.DeviceID='Microsoft XPS Document Writer'").Delete_
WScript.CreateObject("WbemScripting.SWbemLocator").ConnectServer(".", "root\cimv2").Get("Win32_Printer.DeviceID='Fax'").Delete_

WScript.Quit 0

''''''''''End of code''''''''''''''''''''''''''''''''
FUNCTION isAdminRights()
SET oReg = GetObject("winmgmts:root\default:StdRegProv")
strKey = "System\CurrentControlSet\Control\Session Manager"
intErrNum = oReg.CheckAccess(HKLM, strKey, KQV + KSV, flagAccess)
isAdminRights = flagAccess
END FUNCTION

Система с ВКЛюченным контролем учетных записей ( ничего не менял) - при запуске двойной клик левой кнопкой мышки по файлу 1.vbs - вылазиет стандартное окно Контроль учетных записей пользователей, кнопки Да или Нет, нажимаем Да - принтер удаляется

Система с ВЫКЛюченным контролем учетных записей ( ползунок в самый низ, перезагрузка компьютера ) - при запуске двойной клик левой кнопкой мышки по файлу 1.vbs - ничего не вылазиет - принтер удаляется

Отлично, то что надо!

Iska
23-03-2020, 22:46
SharkyEXE, у меня включён контроль учётных записей, пользователь входит в группу Администраторы, я открываю интерпретатор команд (без повышения привилегий), исполняю любой из двух приведённых мною скриптов (опять-таки — без повышения привилегий), и ранее установленный принтер удаляется. Windows 7 SP1 x64.

SharkyEXE
23-03-2020, 22:52
Iska

Здравствуйте.

Я написал так, как мне привычнее :)

Кому-то, может быть, как мне, проще чуть больше кода, зато наверняка

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

Iska
24-03-2020, 00:26
SharkyEXE, я написал лишь о том, что у меня, в моих конкретных условиях, отрабатывает и без повышения привилегий до административных.

SharkyEXE
24-03-2020, 06:18
Iska

Понятно.

PS. Вы бы не могли, пожалуйста, эту строку
WScript.CreateObject("WbemScripting.SWbemLocator").ConnectServer(".", "root\cimv2").Get("Win32_Printer.DeviceID='Fax'").Delete_перевести на язык Autoit?

Iska
24-03-2020, 12:22
Например, так:
AutoItSetOption("MustDeclareVars", 1)

Local $oSWbemLocator = ObjCreate("WbemScripting.SWbemLocator")

$oSWbemLocator.ConnectServer(".", "root\cimv2").Get("Win32_Printer.DeviceID='Epson Stylus C20 Series (M)'").Delete_

Exit(0)

SharkyEXE
24-03-2020, 21:34
Iska

А никак нельзя в одну строку соединить эту команды, пожалуйста?
Local $oSWbemLocator = ObjCreate("WbemScripting.SWbemLocator")

$oSWbemLocator.ConnectServer(".", "root\cimv2").Get("Win32_Printer.DeviceID='Epson Stylus C20 Series (M)'").Delete_

Iska
24-03-2020, 22:05
А никак нельзя в одну строку соединить эту команды »
(ObjCreate("WbemScripting.SWbemLocator")).ConnectServer(".", "root\cimv2").Get("Win32_Printer.DeviceID='Epson Stylus C20 Series (M)'").Delete_
Но! Чтобы скомпилировать скрипт, потребуется отключить умолчальную проверку синтаксиса утилитой Au3Check. В коде:
#AutoIt3Wrapper_Run_Au3Check=N
или вручную.

SharkyEXE
24-03-2020, 22:09
Iska

Спасибо.

1) В коде, как я понял, это будет так
#AutoIt3Wrapper_Run_Au3Check=N
(ObjCreate("WbemScripting.SWbemLocator")).ConnectServer(".", "root\cimv2").Get("Win32_Printer.DeviceID='Epson Stylus C20 Series (M)'").Delete_и компилировать, создать exe
2) А вручную как это делается, чтобы была одна строка
(ObjCreate("WbemScripting.SWbemLocator")).ConnectServer(".", "root\cimv2").Get("Win32_Printer.DeviceID='Epson Stylus C20 Series (M)'").Delete_и компилировать, создать exe

Iska
24-03-2020, 22:21
Так — \Tools\Compile:
https://i.imgur.com/vQCQo37.png
что, собственно, приводит к тому же — установке в коде:
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Run_AU3Check=n
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****

Либо же так:
"C:\Program Files\AutoIt3\Aut2Exe\Aut2exe_x64.exe" /in "C:\Мои проекты\0307\0001.au3"
Но Вы мне скажите, зачем Вам нужна одна строка? Поскольку для «продакшена» нужно таки будет отслеживать факт существования или отсутствия указанного принтера (а не вываливаться с ошибкой времени исполнения).

SharkyEXE
24-03-2020, 22:25
Но Вы мне скажите, зачем Вам нужна одна строка? »
Меньше кода - тем более, чем плохо, что одно одной строкой добиться цели - удалить принтер

Iska
24-03-2020, 23:11
SharkyEXE, третий (и последний) принцип построения программ звучит так: «Наглядность».

SharkyEXE
05-04-2020, 19:48
Iska

Здравствуйте.

Вы бы не могли, пожалуйста, эту строку
wmic.exe Printer where "DeviceID='Epson Stylus C20 Series (M)'" deleteперевести на язык Autoit?
Спасибо.

Iska
05-04-2020, 20:08
SharkyEXE, я уже переводил (http://forum.oszone.net/post-2914469.html#post2914469) по Вашей просьбе пару недель назад.

SharkyEXE
05-04-2020, 20:14
Iska

Здравствуйте.

Прошу прощения, вполне возможно, я не так выразился, мне нужно, чтобы в файл 1.au3 написать строку типа
wmic.exe Printer where "DeviceID='Epson Stylus C20 Series (M)'" delete
Чтобы скомпилировать в exe и удалить принтер

Я методом тыка уже пробую
RunWait(@ComSpec & ' /c ' & 'wmic.exe Printer where "DeviceID='Microsoft XPS Document Writer'" delete',"", @SW_HIDE)

Не получается

Iska
05-04-2020, 21:01
мне нужно, чтобы в файл 1.au3 написать строку типа »
В чём проблема вписать в Ваш файл 1.au3 в потребное Вам место две строки:
Local $oSWbemLocator = ObjCreate("WbemScripting.SWbemLocator")

$oSWbemLocator.ConnectServer(".", "root\cimv2").Get("Win32_Printer.DeviceID='Epson Stylus C20 Series (M)'").Delete_

(заменив выделенное на Ваш принтер)?

SharkyEXE
05-04-2020, 21:09
Iska

Здравствуйте.

Для чего мне хотелось несколько способов удаления принтеров - wmic, vbs, cmd

Я пишу скрипт на языке autoit, туда есть желание вставить способы удаления принтеров, используя wmic, vbs, cmd, чтобы запустить скрипт и принтеры удалились

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

Iska
05-04-2020, 21:20
SharkyEXE, это один и тот же способ. Вы можете стирать мел с доски белой тряпкой, чёрной тряпкой, хоть синей тряпкой — в основе будет лежать одна и та же технология, в данном случае — Wbem.




© OSzone.net 2001-2012