Excel vba защищенный просмотр

 

vikttur

Пользователь

Сообщений: 47199
Регистрация: 15.09.2012

#1

12.05.2020 00:12:06

Взываю к коллективному разуму )

Исходные.
Папка «test». В ней множество папок, в каждой из которых до 30 книг. Книги создавались сторонним приложением, многие из них открываются в режиме защищенного просмотра.
Папка «test» добавлена в исключения защитника системы. Как я понимаю, если папка в исключениях, то и все ее содержимое в исключениях.

Проблема.

Открывание макросом книг с Protect View приводит к ошибке — система считает, что она меня спасает от катастрофы.

Код
Sub test()
    Dim wBook As Workbook
    Dim sPath As String, sFName As String
    
    sPath = "D:": sFName = "abc.xls"
    Set wBook = Workbooks.Open(Filename:=sPath & sFName, ReadOnly:=True)
    
    Set wBook = Nothing
End Sub

ReadOnly:=True не помогает.
Можно ли обойти защиту?  Нужно только открыть и взять в массив данные.

Примера для тестирования нет. Вернее, таких книг куча, но туда смотреть «низзя!», секреты.
Подойдет любая книга в режиме защищенного просмотра

P.S. Изменил переменную (замечание ниже)

 

Виктор,
в коде ошибка
sPath <> sFldr
у меня файл, который с проводника открывается в режиме Защищенного просмотра с вопросом «Разрешить редактирование»
стандартный Workbooks.Open открывает без всяких вопросов и ЮзедРендж залетает в массив тоже без проблем

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

Игорь

Пользователь

Сообщений: 3631
Регистрация: 23.12.2012

#3

12.05.2020 04:07:12

Цитата
Книги создавались сторонним приложением

не имеет значения, как создавались

Цитата
Папка «test» добавлена в исключения защитника системы. Как я понимаю, если папка в исключениях, то и все ее содержимое в исключениях.

Вовсе нет. никакой связи.
Если речь по Защитника Windows — то он не связан никак с Office (по крайней мере, касательно этой темы)

Вероятная причина проблемы: в настройках безопасности Excel заданы ограничения
Решение проблемы: нажимаем в меню Excel Файл — Параметры — Центр управления безопасностью, и потом справа кнопку Параметры центра управления безопасностью ….
В появившемся окне в левом столбце есть пункты Надёжные расположения и Надёжные документы.
По очереди заходим в каждый из этих разделов, и ставим галочки «Отключить все надёжные расположения» и «Отключить надёжные документы».
Ну и на вкладке ЗАЩИЩЕННЫЙ ПРОСМОТР снимаем все галочки.
Теперь закрываем Excel, и пробуем снова запустить макрос.

Изменено: Игорь12.05.2020 04:12:42

 

vikttur

Пользователь

Сообщений: 47199
Регистрация: 15.09.2012

#4

12.05.2020 10:20:52

Цитата
Ігор Гончаренко написал: в коде ошибкаsPath <> sFldr

ага, это путь для примера прописывал, в рабочем коде все в порядке.

Цитата
стандартный Workbooks.Open

А у меня нестандартный?

Цитата
Игорь написал:  ставим галочки «Отключить все надёжные расположения» и «Отключить надёжные документы».
Ну и на вкладке ЗАЩИЩЕННЫЙ ПРОСМОТР снимаем все галочки

К сожалению, не помогло. Та же попытка защитить меня, неразумного. При открывании вручную предупреждение тоже осталось.

 

Андрей VG

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

#5

12.05.2020 11:13:55

Доброе время суток.
Виктор, попробуйте со всеми приседаниями

Код
Set wBook = Workbooks.Open(Filename:=sPath & sFName, Editable:=False, IgnoreReadOnlyRecommended:=True, Notify:=False, UpdateLinks:=False, ReadOnly:=False)
 

vikttur

Пользователь

Сообщений: 47199
Регистрация: 15.09.2012

#6

12.05.2020 11:32:29

Спасибо, Андрей, но и зарядка не помогла )

В Надежных документах: «Отключить надежные документы» — галку вернул на место
В Защищенном просмотре — все галки вернул на место.
В Надежном расположении: «Разрешить надежные расположения» — галку вернул на место.
Помогло добавление вложенных папок  (каждой) в надежные расположения.
В макросе без галки разрешения, видимо, не получится.

Спасибо за помощь. Подсказки дали пинок в нужную сторону.

Мне нужно извлечь данные из файла (‘DatabaseExport.xlsx’), который был сгенерирован и вновь открыт с сайта интрасети. Файл открывается в режиме защищенного просмотра (желтый баннер в верхней части экрана). Я думаю, что необходимо отключить защищенное представление, чтобы я мог извлечь данные из файла. Мой VBA содержится в отдельном файле ‘GetAndAnalyseData.xlsm’:

NameOfNewFile = "ooo"
Do
    On Error Resume Next
        Application.ActiveProtectedViewWindow.Edit  'This never works first time
        NameOfNewFile = Left(ActiveWorkbook.Name, 14)
    On Error GoTo 0

    If NameOfNewFile = "ooo" Then
        ttt = MsgBox("this should not be possible!", vbOKCancel)
        If ttt = vbCancel Then Stop
    End If
Loop While NameOfNewFile = "ooo"

И вот что происходит, когда я запускаю код:

  1. Я получаю сообщение о том, что «это не должно быть возможно!»
  2. Если я нажимаю ОК, я получаю одно и то же сообщение, и файл остается в режиме защищенного просмотра.
  3. Если я нажимаю Отмена, а затем F5 (чтобы продолжить выполнение), цикл работает как надо (защищенное представление отменяется, значение TEMP устанавливается на имя файла, цикл завершается, и макрос продолжается.

Строка, в которой я пытаюсь присвоить значение для NameOfNewFile, возвращает ошибку, если я не использую «Resume Next»:

  • Ошибка времени выполнения ’91’: переменная объекта или переменная блока не установлены

Я пробовал несколько способов исправить это:

  1. Запуск этой строки перед загрузкой файла, а также непосредственно перед попыткой отключить защищенный просмотр, но поведение остается тем же.

    Application.AutomationSecurity = msoAutomationSecurityForceDisable
    
  2. Превращение папки (в которой хранится загруженный файл) в надежное место, но это не разрешено моими пользовательскими настройками.

  3. Снимите флажок «Включить защищенное представление для файлов, исходящих из Интернета» в центре управления безопасностью, но если этот флажок не установлен, я даже не могу открыть файл.

  4. Вставка этого кода (но «Set wbPV line» вызывает ошибку во время выполнения «424»: требуется объект):

    Dim wbPV As Workbook
    If Application.ProtectedViewWindows.Count > 0 Then
        Set wbPV = ActiveProtectedViewWindow.Edit
    End If
    

Это должно быть сделано для нескольких файлов, довольно часто, и поэтому было бы полезно решить это в VBA. Может кто-нибудь помочь мне найти способ программно отключить защищенный просмотр для этого типа загружаемого файла? Или есть какой-то другой способ получить данные из файла?

Night Ranger

Заблокирован

1

Как включить доверие и уровень безопасности (решение)

05.01.2015, 00:36. Показов 5139. Ответов 20

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

До недавнего времени я не мог найти подходящего решения в интернете
несколько дней гуглил, пока не понял что кроме меня этого никто не сделает

из VBA программно этого сделать нельзя,
так-как после закрытия книги, в реестр заново записываются эти параметры

я решил сделать через WScript, тоесть специальный файл с расширением .VBS

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

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

После того как книга вновь проверила реестр, и условия соблюдены,
то файл со скриптом просто удаляется, визуально это можно не заметить,
если в самом скрипте убрать (закоментировать) MsgBox (который сообщяет об успехе)

Вот этот код: его нужно поместить в модуль «ЭтаКнига»

Кликните здесь для просмотра всего текста

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Option Explicit
 
Private Sub Workbook_Open()
    Dim WShell As Object, RKey, FName, vLine
    Const txVBS = "On Error Resume Next[10][10]Dim obExcel, WShell, RKey[10]Set obExcel = CreateObject([34]Excel.Application[34])[10]Set WShell = CreateObject([34]WScript.Shell[34])[10][10]WScript.Sleep 2000[10][10]RKey = [34]HKEY_CURRENT_USERSoftwareMicrosoftOffice[34] & obExcel.Version & [34]ExcelSecurity[34][10]'WShell.RegWrite RKey & [34]VBAWarnings[34], 1, [34]REG_DWORD[34][10]WShell.RegWrite RKey & [34]Level[34], 1, [34]REG_DWORD[34][10]WShell.RegWrite RKey & [34]AccessVBOM[34], 1, [34]REG_DWORD[34][10]MsgBox [34]Уровни безопасности для Excel [34] & obExcel.Version & [34] установлены. Нажмите ОК для продолжения...[34], vbInformation, [34]Установка уровней безопасности [34][10][10]Err.Clear"
    Set WShell = CreateObject("WScript.Shell")
    RKey = "HKEY_CURRENT_USERSOFTWAREMicrosoftOffice" & Application.Version & "ExcelSecurity"
    FName = WShell.SpecialFolders("Desktop") & "Excel_Security_Script.vbs"
    With CreateObject("scripting.filesystemobject")
        If WShell.RegRead(RKey & "AccessVBOM") + WShell.RegRead(RKey & "Level") <> 2 Then
            With .CreateTextFile(FName)
                For Each vLine In Split(Replace(txVBS, "[34]", """"), "[10]")
                    'Запись строк для WScript
                    .WriteLine vLine
                Next
                'необходимо дописать в конец скрипта полный путь этой книги для запуска
                '
                .WriteLine "CreateObject(""Shell.Application"").Open " & """" & ThisWorkbook.FullName & """"
            End With
            CreateObject("Shell.Application").Open FName
            Application.Quit 'Выход из этой книги (перезапуск будет в скрипте)
        ElseIf .FileExists(FName) Then .DeleteFile (FName) 'Если же файл создан то надо его убрать
        End If
    End With
End Sub

После чего можно получать программный доступ, например надо вам календарь ? -пожалуйста
для этого не нужно открывать и устанавливать флажки:

Visual Basic
1
2
3
4
5
6
7
8
9
    tx = "MSACAL"
    For Each v In ThisWorkbook.VBProject.References
        If LCase(v.Name) = LCase(tx) Then v = v.Name: Exit For
    Next
    If Len(v) = 0 Then
        ThisWorkbook.VBProject.References.AddFromFile tx & ".ocx"
    End If
 
    Set cl = Me.Controls.Add("MSCAL.Calendar.7")

Вот еще лучше, теперь ожидание сниженно до

1 секунды

, убрал MsgBox из скрипта
и сделал скрипт компактнее, внимательно прозондировал эту тему,
действительно, в реестре больше ничего менять не надо !

Кликните здесь для просмотра всего текста

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Option Explicit
 
Private Sub Workbook_Open()
    Dim WShell As Object, RKey, FName$, vLine
    Const txVBS = "On Error Resume Next[10]Dim obExcel, WShell, RKey[10]Set obExcel = CreateObject([34]Excel.Application[34])[10]Set WShell = CreateObject([34]WScript.Shell[34])[10]WScript.Sleep 1000[10]RKey = [34]HKEY_CURRENT_USERSoftwareMicrosoftOffice[34] & obExcel.Version & [34]ExcelSecurity[34][10]WShell.RegWrite RKey & [34]Level[34], 1, [34]REG_DWORD[34][10]WShell.RegWrite RKey & [34]AccessVBOM[34], 1, [34]REG_DWORD[34][10]Err.clear[10]"
    Set WShell = CreateObject("WScript.Shell")
    RKey = "HKEY_CURRENT_USERSOFTWAREMicrosoftOffice" & Application.Version & "ExcelSecurity"
    FName = WShell.SpecialFolders("Desktop") & "Excel_Security_Script.vbs"
 
    With CreateObject("scripting.filesystemobject")
        If Not (WShell.RegRead(RKey & "AccessVBOM") = 1 And WShell.RegRead(RKey & "Level") = 1) Then
            With .CreateTextFile(FName)
                For Each vLine In Split(Replace(txVBS, "[34]", """"), "[10]")
                    'Запись строк
                    .WriteLine vLine
                Next
                'необходимо дописать в конец скрипта полный путь этой книги для запуска и паузу
                '
                .WriteLine "CreateObject(""Shell.Application"").Open " & """" & ThisWorkbook.FullName & """"
                .WriteLine "WScript.Sleep 1000"
            End With
            WShell.Run """" & FName & """", 1, 0 'Немедленное выполнение
            Application.Quit 'Выход из этой книги (перезапуск будет в скрипте)
        ElseIf .FileExists(FName) Then .DeleteFile FName 'Если же файл создан то надо его убрать
        End If
    End With
End Sub

Еще не на всех версиях тестировал, так-что если появяться замечания сообщите пожалуйста здесь.



0



Night Ranger

Заблокирован

05.01.2015, 00:47

 [ТС]

2

Естественно это будет работать, если уровень на момент открытия книги не слишком высокий
и поддержка VB-скриптов имеется, (обычно такое у всех есть)
иначе Excel ругнётся, и ничего вообще не запустит (сообщит что макросы отключенны)
Вот пустая книга, с одной процедурой



0



Night Ranger

Заблокирован

05.01.2015, 12:59

 [ТС]

3

Вот еще момент, 20 строчку из второго примера тоже можно убрать
еще раз протестировал, она не нужна (.WriteLine «WScript.Sleep 1000»)

Тестировал я так:
экспортировал папку реестра с ключем ..ExcelSecurity с «плохими» настройками
и переодически запускал, так я сократил массу времени



0



es geht mir gut

11264 / 4746 / 1183

Регистрация: 27.07.2011

Сообщений: 11,437

05.01.2015, 18:47

4

Цитата
Сообщение от Night Ranger
Посмотреть сообщение

Вот еще момент, 20 строчку из второго примера тоже можно убрать
еще раз протестировал, она не нужна

А что ж ты спешишь выложить полусырой код? Доведи до ума, потом выкладывай



0



Night Ranger

Заблокирован

05.01.2015, 19:41

 [ТС]

5

Цитата
Сообщение от SoftIce
Посмотреть сообщение

Доведи до ума, потом выкладывай

Полностью довести до совершенства можно только код из 3 строчек,
а у меня код который генерирует другой код, и который должен поковыряться в реестре
и обратно запустить программу которая его породила а затем, мамка-программа второй код уничтожает, это на словах.. на деле посложнее

Кстати, забыл скинуть то что должно быть в скрипте:

Visual Basic
1
2
3
4
5
6
7
8
9
10
Dim obExcel, WShell, RKey
On Error Resume Next
Set obExcel = CreateObject("Excel.Application")
Set WShell = CreateObject("WScript.Shell")
RKey = "HKEY_CURRENT_USERSoftwareMicrosoftOffice" & obExcel.Version & "ExcelSecurity"
WShell.RegWrite RKey & "Level", 1, "REG_DWORD"
WShell.RegWrite RKey & "AccessVBOM", 1, "REG_DWORD"
Err.clear
 
CreateObject("Shell.Application").Open "C:Documents and Settings{{{тут мой рабочий стол}}}Файл.xls"

И вот итоговый код для книги, все работает исправно,
единственные сомнения это по версиям, версии выше 2003 с прибабахами, я не уверен как они будут работать

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Option Explicit
 
Private Sub Workbook_Open()
    Dim WShell As Object, RKey, FName$, vLine
    Const txVBS = "Dim obExcel, WShell, RKey[10]On Error Resume Next[10]Set obExcel = CreateObject([34]Excel.Application[34])[10]Set WShell = CreateObject([34]WScript.Shell[34])[10]RKey = [34]HKEY_CURRENT_USERSoftwareMicrosoftOffice[34] & obExcel.Version & [34]ExcelSecurity[34][10]WShell.RegWrite RKey & [34]Level[34], 1, [34]REG_DWORD[34][10]WShell.RegWrite RKey & [34]AccessVBOM[34], 1, [34]REG_DWORD[34][10]Err.clear[10]"
    Set WShell = CreateObject("WScript.Shell")
    RKey = "HKEY_CURRENT_USERSOFTWAREMicrosoftOffice" & Application.Version & "ExcelSecurity"
    FName = WShell.SpecialFolders("Desktop") & "Excel_Security_Script.vbs"
    With CreateObject("scripting.filesystemobject")
        If Not (WShell.RegRead(RKey & "AccessVBOM") = 1 And WShell.RegRead(RKey & "Level") = 1) Then
            With .CreateTextFile(FName)
                For Each vLine In Split(Replace(txVBS, "[34]", """"), "[10]")
                    'Запись строк
                    .WriteLine vLine
                Next
                'необходимо дописать в конец скрипта полный путь этой книги для запуска
                '
                .WriteLine "CreateObject(""Shell.Application"").Open """ & ThisWorkbook.FullName & """"
            End With
            WShell.Run """" & FName & """", 1, 0 'Немедленное выполнение
            Application.Quit 'Выход из этой книги (перезапуск будет в скрипте)
        ElseIf .FileExists(FName) Then .DeleteFile FName 'Если же файл создан то надо его убрать
        End If
    End With
End Sub



0



The trick

05.01.2015, 19:43

Не по теме:

Палишься опять…



0



Night Ranger

Заблокирован

06.01.2015, 15:14

 [ТС]

7

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

[продолжение следует, сейчас еще внесу исправлений для других офисов]

Добавлено через 2 часа 48 минут
Окончательный вариант !
протестировал на других версиях, еще раз все пере-проверил и вот:

Код для модуля книги, (обычно с названием «ЭтаКнига»)

Кликните здесь для просмотра всего текста

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
Option Explicit
 
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    With ThisWorkbook 'Предупреждение о конфиденциальной информации =False
        If .RemovePersonalInformation Then .RemovePersonalInformation = False
    End With
End Sub
 
Private Sub Workbook_Open()
    Dim WShell As Object, RKey, FName$, vLine, ReadSettings$
    Const txVBS = "Dim RKey[10]On Error Resume Next[10]RKey = [34]HKEY_CURRENT_USERSoftwareMicrosoftOffice[34] & CreateObject([34]Excel.Application[34]).Version & [34]ExcelSecurity[34][10]With CreateObject([34]WScript.Shell[34])[10]    .RegWrite RKey & [34]Level[34], 1, [34]REG_DWORD[34][10]    .RegWrite RKey & [34]AccessVBOM[34], 1, [34]REG_DWORD[34][10]    .RegWrite RKey & [34]VBAWarnings[34], 1, [34]REG_DWORD[34]"
    Set WShell = CreateObject("WScript.Shell")
    RKey = "HKEY_CURRENT_USERSOFTWAREMicrosoftOffice" & Application.Version & "ExcelSecurity"
    FName = WShell.SpecialFolders("Desktop") & "Excel_Security_Script.vbs"
    With CreateObject("scripting.filesystemobject")
        On Error Resume Next 'Ключи могут быть пустыми
        ReadSettings = ReadSettings & WShell.RegRead(RKey & "AccessVBOM")
        ReadSettings = ReadSettings & WShell.RegRead(RKey & "Level")
        ReadSettings = ReadSettings & WShell.RegRead(RKey & "VBAWarnings")
        'Должно выйти это значение !
        If ReadSettings <> "111" Then
            With .CreateTextFile(FName)
                For Each vLine In Split(Replace(txVBS, "[34]", """"), "[10]")
                    .WriteLine vLine '<------ Запись строк
                Next
                'Дописать полный путь этой книги для запуска
                .WriteLine "    .Run """"""" & ThisWorkbook.FullName & """"""", 1, 0"
                .WriteLine "End With"
            End With
            WShell.Run """" & FName & """", 1, 0 'Немедленное выполнение
            Application.Quit 'Выход из этой книги (перезапуск будет в скрипте)
        ElseIf .FileExists(FName) Then .DeleteFile FName 'Если же файл создан то надо его убрать
        End If
    End With
End Sub
 
Sub test()
    'Эта процедура не нужна, она демонстрирует возможность доступа
    Dim v, result
    On Error Resume Next
    For Each v In ThisWorkbook.VBProject.References
        result = result & vbCrLf & v.Name
    Next
    If Len(result) = 0 Then MsgBox "Доступ к VBA-проекту невозможен", 64: Exit Sub
    v = _
    "Если вы видите этот текст, значит доступ к проекту VBA = Yes" & vbCrLf & _
    "Подключенные библиотеки:"
    MsgBox v & result, 64
End Sub

И вот как красиво это смотриться в скрипте:

Visual Basic
1
2
3
4
5
6
7
8
9
Dim RKey
On Error Resume Next
RKey = "HKEY_CURRENT_USERSoftwareMicrosoftOffice" & CreateObject("Excel.Application").Version & "ExcelSecurity"
With CreateObject("WScript.Shell")
    .RegWrite RKey & "Level", 1, "REG_DWORD"
    .RegWrite RKey & "AccessVBOM", 1, "REG_DWORD"
    .RegWrite RKey & "VBAWarnings", 1, "REG_DWORD"
    .Run """C:Documents and SettingsUserNameРабочий столБезопасность Excel.xls""", 1, 0
End With

три кавычки нужны были для того, чтобы система увидела путь в кавычках .Run «C:.. и тд
остальные параметры знать не обязательно

для того чтобы убедиться как всё работает
можно запустить макрос с названием Test (он в модуле книги)



0



62 / 4 / 1

Регистрация: 27.04.2014

Сообщений: 100

26.01.2015, 12:13

8

Работает, но файл не открывается по новой через скрипт, только excel.



0



62 / 4 / 1

Регистрация: 27.04.2014

Сообщений: 100

04.02.2015, 00:32

9

Если сбивается ассоциация .vbs, то выскакивает сообщение «Отсутствует исполняющее ядро для расширения .vbs» и файл с кодом вообще не удается открыть. Помогает ASSOC .VBS=VBSFile в CMD.



1



Night Ranger

Заблокирован

04.02.2015, 10:04

 [ТС]

10

Цитата
Сообщение от barinrec
Посмотреть сообщение

Помогает ASSOC .VBS=VBSFile в CMD.

Вам просто надо чтото исправить в системе, то что не может работать VBS
это ненормально, много есть хороших утилит с использованием VBS

я даже когда свою систему переставлял, у меня в комплекте уже было полно этого утиля в сборке, как-раз и преднозначенного для работы с системой, а у некоторых и батники не работают, вернее они работают
но скорее всего в системном реестре включен запрет на запуск файлов .com и .bat
опять-же это ненормальная ситуация

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



1



62 / 4 / 1

Регистрация: 27.04.2014

Сообщений: 100

11.02.2015, 16:01

11

Цитата
Сообщение от Night Ranger
Посмотреть сообщение

Вам просто надо чтото исправить в системе, то что не может работать VBS
это ненормально, много есть хороших утилит с использованием VBS

Это просто к тому, что нет 100 % гарантии срабатывания. Мне в итоге было тупо не открыть файл, он сразу же запиливался и вываливалась ошибка.

Может добавить в код проверку ассоциации и восстановление на всякий?

Night Ranger, еще сможете подсказать, как открыть файл с кодом снова, после исполнения кода?



0



Night Ranger

Заблокирован

11.02.2015, 16:23

 [ТС]

12

Цитата
Сообщение от barinrec
Посмотреть сообщение

еще сможете подсказать, как открыть файл с кодом снова, после исполнения кода?

позже сделаю, думаю там нужно вставить диалог, который бы спрашивал
любознательных, и предлагал оставить или удалить файл

Добавлено через 10 минут
Или если надо, можете просто закоментировать эту строчку

Visual Basic
1
ElseIf .FileExists(FName) Then .DeleteFile FName 'Если же файл создан то надо его убрать



0



62 / 4 / 1

Регистрация: 27.04.2014

Сообщений: 100

11.02.2015, 16:32

13

Night Ranger, имел в виду файл ексель (в котором vba код), чтобы он приоткрылся по новой.



0



Night Ranger

Заблокирован

11.02.2015, 16:48

 [ТС]

14

Цитата
Сообщение от barinrec
Посмотреть сообщение

Night Ranger, имел в виду файл ексель (в котором vba код), чтобы он приоткрылся по новой.

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

Добавлено через 6 минут
Вот она

Visual Basic
1
2
.Run """C:Documents and SettingsUserNameРабочий столБезопасность Excel.xls""", 1, 0
End With

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

Bash
1
REG DELETE HKCUSoftwareMicrosoftWindowsCurrentVersionRun /f /v "HW_OPENEYE_OUC_Connect Manager"



1



62 / 4 / 1

Регистрация: 27.04.2014

Сообщений: 100

11.02.2015, 16:57

15

Цитата
Сообщение от Night Ranger
Посмотреть сообщение

Вот она
Код Visual Basic
1
2
.Run «»»C:Documents and SettingsUserNameРабочий столБезопасность Excel.xls»»», 1, 0
End With

Странно, на другом компе на 10 версии офиса сработала, но защищенный просмотр ставил палки в колеса.
До этого на 13 версии пробовал, файл ексель не открывался повторно…

Night Ranger, а защищенный просмотр возможно отключить программно?



0



Night Ranger

Заблокирован

11.02.2015, 17:15

 [ТС]

16

Цитата
Сообщение от barinrec
Посмотреть сообщение

а защищенный просмотр возможно отключить программно?

Скорее всего да, потомучно все эти значения обычно в реестре храняться
но даже если бы в другом месте, то всёравно можно, всё можно сделать программно
раз из экселя можно чтото менять то и внешними программами можно наверняка
к сожалению у меня нет ни 10 ни 13 версии, поэтому могу только предпологать

Добавлено через 2 минуты
Пользуюсь 2003-им, и пока никто из моих работодателей не жаловался,
чем моложе версия, тем больше в ней глюков, и нет пространства для творчества

Добавлено через 4 минуты
Простой пример глюка,
вот недавно делал компонент, и по закрытию офис начинал чтото спрашивать
Так я его решил принудительно закрывать да и всё

Visual Basic
1
2
3
4
5
    On Error Resume Next
    If Ambient.UserMode Then
        Shell "taskkill /f /IM winword.exe /T", vbHide
        Set Vars = Nothing
    End If

Добавлено через 3 минуты
Shell это тоже какбэ инструкция для выполнения команд
а префикс /T завершает все включая дочерние процессы Word



1



Night Ranger

Заблокирован

12.02.2015, 02:12

 [ТС]

17

Вот, как и обещал, альтернативный запуск, только вместо VBS внешним исполняемым файлом будет батник (файл с расширением BAT), с таким вот текстом:

Bash
1
2
3
4
5
@echo off
REG ADD "HKEY_CURRENT_USERSoftwareMicrosoftOffice11.0ExcelSecurity" /f /v "AccessVBOM" /t REG_DWORD /d 1
REG ADD "HKEY_CURRENT_USERSoftwareMicrosoftOffice11.0ExcelSecurity" /f /v "Level" /t REG_DWORD /d 1
REG ADD "HKEY_CURRENT_USERSoftwareMicrosoftOffice11.0ExcelSecurity" /f /v "VBAWarnings" /t REG_DWORD /d 1
Start "" "C:Documents and SettingsNight_RangerРабочий столКнига с доверием_2.xls"

Код для книги:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
Option Explicit
Private Declare Function CharToOem Lib "user32" Alias "CharToOemA" (ByVal lpszSrc As String, ByVal lpszDst As String) As Long
 
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    With ThisWorkbook 'Предупреждение о конфиденциальной информации =False
        If .RemovePersonalInformation Then .RemovePersonalInformation = False
    End With
End Sub
 
Private Sub Workbook_Open()
    Dim WShell As Object, RKey$, FName$, vLine, ReadSettings$
    Const txBAT = "@echo off[10]REG ADD [34]HKEY_CURRENT_USERSoftwareMicrosoftOffice##.#ExcelSecurity[34] /f /v [34]AccessVBOM[34] /t REG_DWORD /d 1[10]REG ADD [34]HKEY_CURRENT_USERSoftwareMicrosoftOffice##.#ExcelSecurity[34] /f /v [34]Level[34] /t REG_DWORD /d 1[10]REG ADD [34]HKEY_CURRENT_USERSoftwareMicrosoftOffice##.#ExcelSecurity[34] /f /v [34]VBAWarnings[34] /t REG_DWORD /d 1[10]"
    Const ii = """"
    Set WShell = CreateObject("WScript.Shell")
    RKey = "HKEY_CURRENT_USERSOFTWAREMicrosoftOffice" & Application.Version & "ExcelSecurity"
    FName = WShell.SpecialFolders("Desktop") & "Excel_Security_Script.bat"
    With CreateObject("scripting.filesystemobject")
        On Error Resume Next 'Ключи могут быть пустыми
        ReadSettings = ReadSettings & WShell.RegRead(RKey & "AccessVBOM")
        ReadSettings = ReadSettings & WShell.RegRead(RKey & "Level")
        ReadSettings = ReadSettings & WShell.RegRead(RKey & "VBAWarnings")
        'Должно выйти это значение !
        If ReadSettings <> "111" Then
            With .CreateTextFile(FName)
                RKey = Replace(txBAT, "##.#", Application.Version)
                For Each vLine In Split(Replace(RKey, "[34]", """"), "[10]")
                    .WriteLine vLine '<------ Запись строк
                Next
                RKey = ThisWorkbook.FullName
                CharToOem RKey, RKey
                .WriteLine "Start " & String(2, ii) & " " & ii & RKey & ii
                .WriteLine "Exit"
            End With
            ThisWorkbook.Saved = True
            Shell "Cmd /c" & ii & FName & ii 'Запуск сценария
            Application.Quit 'Выход из этой книги (перезапуск будет в батнике)
        ElseIf .FileExists(FName) Then .DeleteFile FName 'Если же файл создан то надо его убрать
        End If
    End With
End Sub
 
Sub test()
    'Эта процедура не нужна, она демонстрирует возможность доступа
    Dim v, result
    On Error Resume Next
    For Each v In ThisWorkbook.VBProject.References
        result = result & vbCrLf & v.Name
    Next
    If Len(result) = 0 Then MsgBox "Доступ к VBA-проекту невозможен", 64: Exit Sub
    v = _
    "Если вы видите этот текст, значит доступ к проекту VBA = Yes" & vbCrLf & _
    "Подключенные библиотеки:"
    MsgBox v & result, 64
End Sub

На всякий случай прилагаю и книгу тоже:

Вложения

Тип файла: xls Книга с доверием_2.xls (31.5 Кб, 9 просмотров)



1



Night Ranger

Заблокирован

12.02.2015, 02:43

 [ТС]

18

Ну вобщем-то, также быстро всё появляется, единственным препятствием может быть
это то, что изначально в настройках макросы могут быть наглухо отключенны, а я знаю
при переустановке офиса обычно так и бывает, и в документах с четырёхбуквенными расширениями у новых офисов, поэтому в идеале книга должна быть с расширением XLS
ну или документ Word с рас-ем DOC



1



Night Ranger

Заблокирован

12.02.2015, 12:53

 [ТС]

19

Еще лучше, смотрите чо придумал !

  • Теперь есть возможность изменить настройки не только Excel но и Word
  • Отсутствие WinApi (отказался от процедуры CharToOem) Свою сделал ручками
  • Возможность оставить файл после перезапуска

Код для модуля книги, с названием «ЭтаКнига»
(хотя этот же код можно вставить в Document_Open для Word-а) :

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
Option Explicit
 
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    With ThisWorkbook 'Предупреждение о конфиденциальной информации =False
        If .RemovePersonalInformation Then .RemovePersonalInformation = False
    End With
End Sub
 
Private Function CharToOem(ByVal Text As String) As String: Dim ss$, i&, j&
    Const cc = "808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1"
    ss = Space(Len(cc)  2): For i = 1 To Len(ss) - 2: Mid$(ss, i, 1) = Chr$(i + 191): Next
    For i = i To i + 1: j = j + 1: Mid$(ss, i, 1) = Chr$(Choose(j, 168, 184)): Next
    CharToOem = Text
    For i = 1 To Len(Text): j = InStr(1, ss, Mid$(Text, i, 1), 0)
        If j Then Mid$(CharToOem, i, 1) = Chr(CLng("&H" & Mid$(cc, (j - 1) * 2 + 1, 2)))
    Next
End Function
 
Private Sub Workbook_Open() 'Этот же код можно разместить в событии *Document_Open*
    Dim WShell As Object, RKey$, FName$, ReadSettings$, a$(), v, w
    Const ii = """", r = "", rr = "/"
    Const k1 = "HKEY_CURRENT_USERSoftwareMicrosoftOffice"
    Const HiveExcel = "ExcelSecurity", HiveWord = "WordSecurity" 'Куст Excel и Word
    Const k3 = "AccessVBOMLevelVBAWarnings"
    Const bk1 = "REG ADD " & ii, bk2 = ii & " /f /v " & ii, bk3 = ii & " /t REG_DWORD /d 1"
    Set WShell = CreateObject("WScript.Shell"): a = Split(k3, r)
    FName = WShell.SpecialFolders("Desktop") & "Security_Settings.bat"
    With CreateObject("scripting.filesystemobject")
        On Error Resume Next 'Ключи могут быть пустыми
        For Each w In Array(HiveExcel, HiveWord): For Each v In a
            RKey = k1 & Application.Version & w
            ReadSettings = ReadSettings & WShell.RegRead(RKey & r & v)
        Next v, w
        If ReadSettings <> String(6, "1") Then
            With .CreateTextFile(FName)
                .WriteLine "@echo off"
                For Each w In Array(HiveExcel, HiveWord): For Each v In a
                    .WriteLine CharToOem(bk1 & k1 & Application.Version & w & bk2 & v & bk3)
                Next v, w
                .WriteLine "Start " & String(2, ii) & " " & ii & CharToOem(ThisWorkbook.FullName) & ii
                .WriteLine "Exit"
            End With
            Shell "Cmd /c" & ii & FName & ii, 0 'Запуск сценария
            Application.Quit 'Выход из этой книги (перезапуск будет в батнике)
             'Если же файл создан то надо его убрать. Ниже варианты как это сделать
        'ElseIf .FileExists(FName) Then .DeleteFile FName
        ElseIf .FileExists(FName) Then If MsgBox( _
        "Удалить этот файл ?" & vbCrLf & FName, 68) = vbYes Then .DeleteFile FName
        End If
    End With
End Sub
 
Sub test()
    'Эта процедура не нужна, она демонстрирует возможность доступа
    Dim v, result
    On Error Resume Next
    For Each v In ThisWorkbook.VBProject.References
        result = result & vbCrLf & v.Name
    Next
    If Len(result) = 0 Then MsgBox "Доступ к VBA-проекту невозможен", 64: Exit Sub
    v = _
    "Если вы видите этот текст, значит доступ к проекту VBA = Yes" & vbCrLf & _
    "Подключенные библиотеки:"
    MsgBox v & result, 64
End Sub

Вот как это смотриться в моём спец-редакторе:

Миниатюры

Как включить доверие и уровень безопасности (решение)
 

Вложения

Тип файла: xls Книга с доверием.xls (42.0 Кб, 8 просмотров)



1



62 / 4 / 1

Регистрация: 27.04.2014

Сообщений: 100

12.02.2015, 14:05

20


Night Ranger, остается забороть защищенный просмотр программно.



0



Время на прочтение
5 мин

Количество просмотров 25K

Всем привет! Я обычный пользователь MS Excel. Не являющийся профессиональным программистом, но накопивший достаточно опыта, для установки и обхода защиты проектов VBA.

Дисклеймер:

В данной статье рассмотрены виды защиты проектов VBA, от несанкционированного доступа. Их сильные и слабые стороны – ранжирование.

Цель статьи показать слабые и сильные стороны каждого вида защиты проекта VBA в MS Office.

Демонстрация разработанных инструментов, в надстройке Macro Tools VBA, для снятия и установки той или иной защиты. 

Все инструменты реализованы стандартными средствами VBA, без использования дополнительных библиотек. 

Главная панель Надстройки Macro Tools VBA

Первый вид защиты — Обычный пароль

Время на снятие: мгновенно

Недостаток: быстрый доступ к запароленному модулю VBA

Стандартный инструмент (В среде VBE: панель Tools -> VBAProject Properties -> Protection). 

Самая легко снимающаяся защита. В интернете легко находится код, для снятия данной защиты. 

Данную защиту можно снять следующим инструментом:

Второй вид защиты — Project is Unviewable

Время на снятие:  от 10 до 15 мин (в ручную)

Недостаток: доступ к исходному коду модуля VBA

Один из самых распространённых видов защит.  Встречается в 95% файлах с защитой модуля VBA. При попытке открыть проект, открывается диалоговое окно, с  сообщением:  Project is Unviewable.


Большинство пользователей Excel, не могут снять данную защиту, так как она имеет множество вариации и нюансов, для ее снятие нужно иметь представление о внутренней структуре файла Excel.

Основан, данный вид защиты, на изменение ключей:

CMG=«4A488FCC54D054D054D054D0»

DPB=«0B09CE0F8E108E108E»

GC=«CCCE09520B120C120CED»

в файле vbaProject.bin

Кратко, как создается данная защита

Для создания данной защиты нужно, разархивировать файл Excel. Перейти в архиве в папку xl, открыть файл vbaProject.bin,  в конце файла находятся наши ключи, редактируем значения ключей на пусто, сохраняем файл. Переводим наш архив, обратно в файл Excel. Готово! 

Это самый простой вариант данной защиты, но существует множество модификаций.

Алгоритм снятия защиты Project is Unviewable.

1)  Разархивируем подопытный файл, переходим в файл  …xl_relsworkbook.xml.rels

2)      В файле workbook.xml.rels  ищем строку, содержащую слово  vbaProject, обычно имеет следующий вид:  />. В этой строке нас интересует ключ Target,иего значение. Значение является название файла, в котором находится проект VBA. Иногда, защищающий меняет значения ключа на printerSettings.bin.Получается маскировка файла с проектом VBA  под другой файл.

3)      Открываем на редактирование файл, указанный в  ключе Target, ищем в файле ключи  CMG, DPB, GC. И меняем в их названиях любую букву на любую другую, например: CMC, DPC, CC. При поиске нужно быть аккуратным, так как защищающий может поместить  в проект форму,  подписью повторяющую один из ключей, например такую: DPB=«0B09CE0F8E108E108E». При ее изменении проект VBA, будет удален из книги Excel.  Сохраняем и закрываем файл.

4)      Переводим архив обратно в файл Excel.

5)      Запускаем приложение Excel, выполняем следующее: в Центре управления безопасностью -> Параметры макросов  -> Отключить все макросы без уведомления. Перезапускаем Excel. Данная операция нужна, для блокировки защиты, которую иногда ставят авторы макросов. Данная защита реализована следующим образом. В модуле VBA «ЭтаКнига», создается процедуры, реагирующие на события открытия книги или закрытия книги. Эти события обычно проверяют, наличие пароля на проект VBA, запрет сохранения и прочее.

6)      Открываем файл. Если все правильно сделано то, Excel, будет ругаться на не правильные ключи, которые мы отредактировали, в пункте 3. Жмем, да, пока данные сообщения не закончатся и диалоговое окно закроется. 

      Если данное сообщение не появляется то, вы отредактировали не файл который содержит проект VBA.

7)      Открываем проект VBA. После всего, проект VBA должен быть доступен.

8)       Но иногда защита не снимается, тогда нужно сохранить файл, проверить, что он действительно сохранился! И проделать повторно операции с 1 по 7. Обычно так происходит когда в файле workbook.xml.rels в ключе Target  установлено printerSettings.bin.При сохранение,  Excel  исправляет это на значение на vbaProject.bin

Данную защиту можно установить и снять следующим инструментом:

Третий вид защиты — Hidden  Module, скрытые модули VBA

Время на снятие:  от 15 до 20 мин (нужен редактор OLE — объектов, Structured Storage Viewer, например.

Недостаток: доступ к коду модуля VBA

Менее распространенный вид  защиты обычно встречается в комбинации с защитой Project is Unviewable. При установке данной защиты модуль VBA не отображается в проекте книги Excel. О его существовании можно узнать, проанализировав код VBA (что требует время!) или открыть файл Excel в программе  OpenOffice  или  LibreOffice (так же можно смотреть код при защите Project is Unviewable, но данный способ не дает возможность получить рабочий файл, без пароля). 

Просмотр кода VBA в  LibreOffice

Кратко, как создается данная защита

Для создания данной защиты нужно отредактировать файл  с проектом VBA — vbaProject.bin  или printerSettings.bin,в зависимости от настроек в файле …xl_relsworkbook.xml.rels. В конце файла удаляются строки вида: Module1=32, 32, 635, 330, Z.  С нужными названиями модулей.

Для снятия данной защиты нужно в файле vbaProject.bin — восстановить удаленные записи модулей.

Данную защиту можно установить следующим инструментом.

Четвертый вид защиты — Обфускация кода

Время на снятие:  неизвестно, зависит от объема кода и пере использования частей кода

Обфусцированный код VBA

Недостаток:  необходимость тестирование файла после обфускации, на работоспособность

Крайне редкий вид защиты, основанный на изменении исходного кода VBA, в не удобочитаемый вид для человека. Удаляются все комментарии, форматирование кода, переименовываются названия всех переменных,  процедур, функций, модулей и прочего. Злоумышленнику никогда не удастся восстановить первоначальный вид кода, и потребует достаточно много времени для, его восстановления в удобно читаемый вид для человека.  

Для де-обфускации кода нужно иметь  время, специализированное ПО.

Данную защиту можно установить следующим инструментом.

Пятый вид защиты — Перенос кода в dll

Время на снятие:  неизвестно, зависит от языка программирования и квалификации

Недостаток:  необходимости в дополнительном  файле dll

Один из самых редких видов защиты. Основная идея перенос основного кода в отдельную библиотеку dll, написанную на любом другом языке программирования. Не распространённость данный вид защиты получил по следующей причине,  необходимости за файлом Excel, «таскать» дополнительный файл, dll.

Для получения доступа к коду dll, нужно обладать специальными знаниями.

Заключение

В заключении хочу выделить бесполезность защит:  Project is Unviewable и Hidden  Module которые, по существу ни отчего не защищают. Позволяют просматривать код VBA, без изменения исходного  файла, в таких программах как OpenOffice  или  LibreOffice. Так и снимаются без особых проблем.

Понравилась статья? Поделить с друзьями:
  • Excel vba защищенный лист
  • Excel vba защита листа от изменения
  • Excel vba защита кода
  • Excel vba зачеркнутый текст
  • Excel vba запустить файл