Вот ситуация: мы заменяем 11 принтеров более новыми моделями, мы будем устанавливать их на нашем сервере печати и распространять их. План состоит в том, чтобы предоставить доступ к новым принтерам под другими именами, чем те, которые они заменяют, и отменить общий доступ к старым.
Поэтому мне нужно придумать способ автоматического удаления клиентских подключений к старым принтерам. Клиенты - это в основном Windows 7 с небольшим количеством XP.
Моей первой идеей было позвонить prnmngr.vbs
из сценария входа в систему, чтобы явно удалить каждый старый принтер по имени. Проблема в том, что некоторые пользователи не выходят из системы по завершении рабочего дня, поэтому я не могу рассчитывать, что их сценарий входа будет запущен до того, как им в следующий раз понадобится распечатать. Я мог удаленно запустить prnmngr.vbs
используя SCCM, но если он не «выдает себя за пользователя», я не думаю, что он удалит их принтеры. Любые идеи? Могу ли я узнать, как получить доступ к WMI с помощью кода C #, и написать «троян» для удаления определенных принтеров, не требуя от пользователя каких-либо действий? (Я шучу только наполовину).
Я открыт для любых предложений! Спасибо!
Настройки принтера групповой политики содержит опцию «Удалить». Если вы развертываете новые принтеры с GPP GPO, вы можете добавить элементы Delete в его конец или создать совершенно новый Delete Printers
GPO.
Я сделал такой переход примерно для 75 принтеров, и он прошел очень гладко. У нас есть один Deploy Printers
GPO связан на уровне домена со всеми принтерами в нем, а сопоставления контролируются членством в группах с использованием таргетинга на уровне элементов. У нас также есть Deleted Printers
GPO на уровне домена, на котором находятся все старые принтеры на старом сервере печати. Я не стал фильтровать это, потому что в этом действительно нет необходимости. Если он старый и нанесен на карту, его нужно убрать!
Хорошая вещь в элементах GPP заключается в том, что они запускаются с интервалами обновления политики, а это означает, что вход в систему / выход из системы / перезагрузка не требуется. Просто настройте политику, свяжите ее и расслабьтесь. Никаких проблем со сценариями, WMI или чем-либо в этом роде.
На самом деле удаление принтеров - самая простая часть.
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colInstalledPrinters = objWMIService.ExecQuery _
("Select * From Win32_Printer Where Network = True")
For Each objPrinter in colInstalledPrinters
objPrinter.Delete_
Next
Сложная (или, по крайней мере, заноза в заднице) часть заключается в том, чтобы донести это до всех пользователей без необходимости что-то делать (например, перезагружать). Честно говоря, моим решением было бы отправить электронное письмо с просьбой перезагрузить пользователей, чтобы сопоставить новые принтеры. Таким образом, вы можете поместить сценарий удаления принтера в Run Once
настройку реестра через GPO, а затем подключите новые принтеры через GPP.
Если у вас небольшая или хорошо организованная среда, вы всегда можете запустить сценарий, чтобы распространить его на все ваши пользовательские рабочие станции с помощью psexec (для этого потребуется .csv
или другой текстовый файл с разделителями со списком ваших рабочих станций), но, опять же, это кажется более сложной задачей, и я бы предпочел просто сказать пользователям о перезагрузке.