Статьи из блога

Статьи из блога

Запрет на распечатку документов с чужого компьютера

Рубрика: Вопрос-Ответ, Макросы
Метки: |
Четверг, 31 января 2008 г.
Просмотров: 11249
Подписаться на комментарии по RSS
Версия для печати

[Ссылки на статью]

Один из читателей сайта задал вопрос:

Скажите пожалуйста, как мне можно поставить в Worde запрет на распечатку через чужой принтер? Возможно вообще такое?

Свое решение этого вопроса представил Леонид Бродский, автор программы LeoBilingua. Он написал:

 

Я думаю, надо запретить не распечатку через чужой принтер, а распечатку с чужого компьютера. Я предлагаю простой, хоть и не очень надёжный способ определить "свой" компьютер - по имени пользователя, заданному в Word.

Приведённый ниже VB код хоть и можно обнаружить в редакторе Visual Basic, но в списке макросов он не виден, так как все процедуры объявлены как Private.

 

Делаем следующее. Защищаемый документ должен быть открыт в Word. Открываем редактор Visual Basic («Alt»+«F11»). В окне проектов щёлкаем правой кнопкой мышки по проекту, относящемуся к данному документу (в прилагаемом файле примера это проект CancelPrinting). Выбираем меню Insert -> Class Module. В окне свойств меняем имя класса, например на PrintController. В окне кода классового модуля PrintController набираем следующий код:

Option Explicit
 
Private WithEvents app As Word.Application
 
Public Property Set ApplicationObject(value As Word.Application)
    'установить ссылку на объект приложения
    Set app = value
End Property
 
Private Sub app_DocumentBeforePrint(ByVal Doc As Document, Cancel As Boolean)
    'проверить имя пользователя
    If app.UserName <> "Антон Кокин" Then
        'отменить печать
        Cancel = True
        Call MsgBox("Распечатка запрещена. Извините!", _
                vbExclamation + vbOKOnly, "Test")
    End If
End Sub

Заменяем текст "Антон Кокин" на своё имя, как оно задано в настройках Word.

 

Тепрерь в окне проектов дважды щёлкаем левой кнопкой мышки по модулю ThisDocument, находящемуся под проектом данного документа (в прилагаемом файле примера это CancelPrinting). Открывается окно кода этого модуля. Там набираем следующий код:

Option Explicit
 
Private controller As PrintController
 
Private Sub Document_New()
    'эта процедура работает при создании нового документа,
    'используя данный как шаблон
    SetPrintController
    MsgBox "Новый документ"
End Sub
 
Private Sub Document_Open()
    'эта процедура работает при каждом открытии документа
    SetPrintController
    MsgBox "Открыть"
End Sub
 
Private Sub SetPrintController()
    'установить ссылку на новый экземпляр класса
    Set controller = New PrintController
    'передать экземпляру класса ссылку на объект приложения
    Set controller.ApplicationObject = Word.Application
End Sub

Сохраняем документ.

 

Чтобы код начал работать, надо закрыть и опять открыть документ. Если же нужна большая безопасность, предлагаю заменить проверку имени на проверку предварительно созданного уникального ключа в регистре с помощью System.ProfileString. Надо будет также как-то защитить VB модули с помощью пароля.

twitter.com facebook.com vkontakte.ru odnoklassniki.ru mail.ru ya.ru rutvit.ru myspace.com technorati.com digg.com friendfeed.com pikabu.ru blogger.com liveinternet.ru livejournal.ru memori.ru google.com bobrdobr.ru mister-wong.ru yahoo.com yandex.ru del.icio.us

Еще записи по вопросам использования Microsoft Word:

Комментариев: 27

  1. А.Стоблогов
    01.02.2008 в 08:21 | #1

    Антон, спасибо за работу которую ты ведешь над своим блогом. Если откровенно, то я даже немного поменял свое снобское отношение к этому редактору :) Просто наверное таких задач не попадалось интересных, как например в этом посте про защиту от печати.

    Вообщем в знак благодарности добавил твой блог в список 100 самых интересных блогов. Удачи!

  2. 01.02.2008 в 09:30 | #2

    Спасибо большое. Слава богу, мне помогают хорошие люди.

  3. Xerox-maN
    01.02.2008 в 11:45 | #3

    В 2000 Word-е не работает :-(

  4. Юра
    02.02.2008 в 09:45 | #4

    На каких редакторах это работает?

  5. Xerox-maN
    04.02.2008 в 09:26 | #5

    Кому не скидывал документ, все распечатали =(((

    Open Office тоже его печатает, думаю все остальные текстовые редакторы поддерживающие документы Word (типа Атлантиса и т.д.) тоже распечатают.

    Самое смешное)))) не распечатывается (если ничего не править) только у меня))))

  6. Ночной
    04.02.2008 в 13:18 | #6

    не работает вышеуказанный способ, больше не существует никаких решений?

  7. Elena
    06.02.2008 в 22:37 | #7

    Спасибо большое, очень полезная опция, особенно для бухгалтерских документов, правда сама не разобралась, брат помог.

  8. smartos
    13.02.2008 в 05:10 | #8

    Что-то у меня не получилось. Не могу понять, где ошибку допустил...

  9. ak
    15.02.2008 в 11:46 | #9

    Ложка дегтя... Хорошая задача для освоения VBA. Но практичность этого совета? Даже если работает, как задумано, ничего, кроме раздражения у пользователя сообщение "Распечатка запрещена, Изивните!" не вызовет. Ctrl+a, Ctrl+C, Ctrl+n, Ctrl+v, Ctrl+p, Enter. Все, документ пошел на печать...

  10. Ольга
    17.02.2008 в 09:19 | #10

    совершенно согласна с ak.

    надо еще запретить копирование текста, тогда запрет печати на другом компьютере будет актуален.

  11. Леонид Бродский
    19.02.2008 в 11:28 | #11

    Задача была решена так, как она была поставлена. :) Хотите запрет на копирование - добавьте эту процедуру в классовый модуль PrintController:

    Private Sub app_WindowDeactivate(ByVal Doc As Document, _
                ByVal Wn As Window)
        'эта процедура работает, когда документ становится неактивным
        Dim dat As DataObject
        Set dat = New DataObject
        dat.SetText ""
        'поместить пустую строку в буфер обмена
        dat.PutInClipboard
        Set dat = Nothing
    End Sub

    Чтобы код работал, нужно добавить в проект ссылку на Microsoft Forms 2.0 Object Library (C:\Windows\System32\FM20.dll). Проще всего это сделать, добавив в проект форму (правый щелчок на "Project (CancelPrinting)" - Insert - UserForm), а затем её удалить. Ссылка будет добавлена автоматически.

  12. Леонид Бродский
    19.02.2008 в 11:33 | #12

    Кстати, строки

    MsgBox "Новый документ"

    и

    MsgBox "Открыть"

    нужны были только для отладки, и в опубликованный код попали по ошибке. Извините! Лучше их удалить.

  13. Rina
    26.02.2008 в 08:41 | #13

    Здравствуйте. Хотела поставить на свою дипломную работу защиту от копирования, но что-то не получается по предложенному Леонидом Бродским варианту это сделать, если можно подробнее объясните как это сделать. Спасибо.

  14. Леонид Бродский
    26.02.2008 в 18:12 | #14

    Rina,

    Объясните, пожалуйста, поподробнее, что именно не получается.

  15. Rina
    27.02.2008 в 06:35 | #15

    Мне надо, чтобы НЕ СМОГЛИ выделить часть текста или весь текст с окна редактора Word скопировать его в буфер обмена и вставить в другой документ.

  16. Леонид Бродский
    29.02.2008 в 13:08 | #16

    Rina,

    В моём посте от 19 февраля 2008 в 11:28 есть решение вашего последнего вопроса. Выделить текст и скопировать его в буфер обмена пользователь другого компьютера сможет, но вставить его в другой документ - нет, так как текст будет удалён из буфера, как только ваш документ станет неактивным.

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

  17. Ольга
    29.02.2008 в 17:05 | #17

    в каких ситуациях может понадобиться запрещать копирование своего текста..

    Для исключения быстрого плагиата. :)

    Пальчиками все перебить можно.

  18. Лунная соната
    01.03.2008 в 11:10 | #18

    НА самом деле от этого никак не защититься )

  19. Rina
    04.03.2008 в 06:50 | #19

    Да, Ольга права, пусть хоть немножко поработают руками.

  20. Леонид Бродский
    12.03.2008 в 11:25 | #20

    Да, похоже, Word для этих трюков не подходит. Достаточно запретить макрокоманды, и - печатай и копируй сколько угодно. Пока я так и не придумал, как сделать, чтобы без макрокоманд текст вообще нельзя было бы прочитать. В таких целях лучше всё-таки пользоваться Adobe Acrobat.

  21. Юлия
    18.03.2008 в 11:53 | #21

    А как сделать чтоб это трюк работал для любого вновь созданного еще не сохраненного файла.

    Если этот файл кинешь в стартуп как шаблон, то все равно при запуске ворда в новом документе не работает! пока не кликнешь создать новый документ!

  22. Леонид Бродский
    18.03.2008 в 12:49 | #22

    Я не знаю, для чего нужна папка Word Startup, но похоже, что новый документ, который появляется в только что открытом Ворде, создаётся из Normal.dot. Зато в хелпе в разделе Control what happens when you start Word написано: "(Startup switches) /ttemplatename

    Start Word with a new document based on a template other than the Normal template. Example: /tMyfax.dot " То есть это то, что надо добавить в ярлык Ворда.

  23. Константин
    04.06.2008 в 07:00 | #23

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

    Скажите, а возможно ли сделать так, чтобы документ, созданный на другой машине/другим пользователем (т.е. конкретный автор документа) нельзя было открыть/распечатать на моем компьютере.

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

  24. Леонид Бродский
    04.06.2008 в 09:59 | #24

    Мне кажется, что Word изначально не расчитан на такие штуки, как управление правами. Для этого лучше подходят средства Windows. Вы пишете, что на компьютере работают ещё 2 человека. Почему бы не создать для каждого свой профиль с запароленным входом и выходить из профиля, как только отходишь от компьютера? Можно попробовать поискать программы, ставящие пароль на использование принтера и т.п.

  25. 21.05.2010 в 13:57 | #25

    Различные запреты, судя по презентации, имеющейся на официальном сайте Windows (презентации можно скачать в виде видеофайлов - порядка 180 Мб), имеются в новом офисе. Возможности нового MS Word 2010 вроде бы позволяют управлять правами и доступом к файлу. Хотя, там пример приведён при использовании MS SharePoint. Надо ждать.

  26. 24.11.2010 в 11:55 | #26

    Попробуйте просто поставить пароль на открытие документа ;-) Все другие решения, основанные на макросах, достаточно легко обойти.

  27. Алла
    14.05.2011 в 21:12 | #27

    Отдельное спасибо Леониду Бродскому за полезные советы, вот только нельзя ли создать такой файл примера, чтобы там одновременно и запрет распечатки, и запрет копирования был, а то у самой не получилось.

Оставьте комментарий!

(обязательно)

^ Наверх