防止密码保护的自毁文件的宏中断
Prevent the macro break for pass-protected self-destructing file
我决定创建一个密码保护文件,该文件将在输入三次错误密码后自毁。宏在打开文件的情况下运行(弹出带有通行证输入字段的用户窗体),但弱点是 Ctrl-Break 允许停止宏并访问代码。
有什么方法可以 disable/prevent 中断特定工作簿中的选项(最好通过 VBA)?
如果你有兴趣,我可以根据要求提供宏。
UPD:这是我正在使用的宏(基于日期)。
Private Sub Workbook_Open()
If Date > Cdate("30/03/2015") Then
WARNING.Show
End If
End Sub
这部分代码分配给用户窗体 "WARNING" 的 "Ok" 和 "Cancel" 按钮。
Public i As Integer
Public b As Integer
Sub setib()
i = 2 - b
b = b + 0
End Sub
Private Sub CnclBtn_Click()
WARNING.Hide
With ThisWorkbook
.Saved = True
.Close False
End With
End Sub
Private Sub OKBtn_Click()
Call setib
Dim Pass As String: Pass = "*your pass*"
Dim PassInput As String: PassInput = WARNING.PassField.Text
If PassInput = Pass Then
MsgBox "Password is correct"
GoTo Safe:
Else
If b < 2 Then
MsgBox "Password is incorrect. " & i & " attempts left."
Else
MsgBox "No More attempts"
End If
If b = 2 Then
WARNING.Hide
GoTo Destroy:
Else
WARNING.PassField.Value = vbNullString
WARNING.PassField.SetFocus
b = b + 1
GoTo EndSub:
End If
End If
Safe:
ActiveWorkbook.VBProject.VBComponents("ThisWorkbook").CodeModule.DeleteLines 1, _
ActiveWorkbook.VBProject.VBComponents("ThisWorkbook").CodeModule.CountOfLines
WARNING.Hide
GoTo EndSub:
Destroy:
With ThisWorkbook
.Saved = True
.ChangeFileAccess xlReadOnly
Kill .FullName
.Close False
End With
EndSub:
Sheet1.Activate
End Sub
您可以简单地用密码保护 VBA 项目。这将避免需要担心 EnableCancelKey
的 Application
级设置。
虽然用户可以 "break" 使用取消键,但如果不提供 VBA 项目的正确密码,他们将无法查看代码。
有了VBA项目保护,用户可以"break"执行代码,用户应该不能输入"break mode",并且 Excel 应用程序将无法交互(因此用户将 无法 访问工作表)。此时,用户窗体将冻结在屏幕上并且应用程序无响应。然后用户有两个选项,我可以看到:
- 如果他们知道用户窗体的名称,他们可以想象从 VBE 中的即时 window
Unload UserForm1
。因此,您应该为 UserForm 选择一些他们不太可能猜到的名称。如果他们这样做,他们将能够访问文件本身,但如果您为 UF 提供安全名称,他们将永远猜不对。
- 否则,它们是 SOL,除非它们 Ctrl+AltDel,并且终止 Excel 应用程序进程。
注意: Excel 密码,无论是在工作表上还是在 VBA 项目(或两者)上,任何有意这样做的人都可以破解,并且只是防止无意中损坏或操纵数据的好方法。
我决定创建一个密码保护文件,该文件将在输入三次错误密码后自毁。宏在打开文件的情况下运行(弹出带有通行证输入字段的用户窗体),但弱点是 Ctrl-Break 允许停止宏并访问代码。
有什么方法可以 disable/prevent 中断特定工作簿中的选项(最好通过 VBA)?
如果你有兴趣,我可以根据要求提供宏。
UPD:这是我正在使用的宏(基于日期)。
Private Sub Workbook_Open()
If Date > Cdate("30/03/2015") Then
WARNING.Show
End If
End Sub
这部分代码分配给用户窗体 "WARNING" 的 "Ok" 和 "Cancel" 按钮。
Public i As Integer
Public b As Integer
Sub setib()
i = 2 - b
b = b + 0
End Sub
Private Sub CnclBtn_Click()
WARNING.Hide
With ThisWorkbook
.Saved = True
.Close False
End With
End Sub
Private Sub OKBtn_Click()
Call setib
Dim Pass As String: Pass = "*your pass*"
Dim PassInput As String: PassInput = WARNING.PassField.Text
If PassInput = Pass Then
MsgBox "Password is correct"
GoTo Safe:
Else
If b < 2 Then
MsgBox "Password is incorrect. " & i & " attempts left."
Else
MsgBox "No More attempts"
End If
If b = 2 Then
WARNING.Hide
GoTo Destroy:
Else
WARNING.PassField.Value = vbNullString
WARNING.PassField.SetFocus
b = b + 1
GoTo EndSub:
End If
End If
Safe:
ActiveWorkbook.VBProject.VBComponents("ThisWorkbook").CodeModule.DeleteLines 1, _
ActiveWorkbook.VBProject.VBComponents("ThisWorkbook").CodeModule.CountOfLines
WARNING.Hide
GoTo EndSub:
Destroy:
With ThisWorkbook
.Saved = True
.ChangeFileAccess xlReadOnly
Kill .FullName
.Close False
End With
EndSub:
Sheet1.Activate
End Sub
您可以简单地用密码保护 VBA 项目。这将避免需要担心 EnableCancelKey
的 Application
级设置。
虽然用户可以 "break" 使用取消键,但如果不提供 VBA 项目的正确密码,他们将无法查看代码。
有了VBA项目保护,用户可以"break"执行代码,用户应该不能输入"break mode",并且 Excel 应用程序将无法交互(因此用户将 无法 访问工作表)。此时,用户窗体将冻结在屏幕上并且应用程序无响应。然后用户有两个选项,我可以看到:
- 如果他们知道用户窗体的名称,他们可以想象从 VBE 中的即时 window
Unload UserForm1
。因此,您应该为 UserForm 选择一些他们不太可能猜到的名称。如果他们这样做,他们将能够访问文件本身,但如果您为 UF 提供安全名称,他们将永远猜不对。 - 否则,它们是 SOL,除非它们 Ctrl+AltDel,并且终止 Excel 应用程序进程。
注意: Excel 密码,无论是在工作表上还是在 VBA 项目(或两者)上,任何有意这样做的人都可以破解,并且只是防止无意中损坏或操纵数据的好方法。