【问题标题】:set and checking password of a workbook设置和检查工作簿的密码
【发布时间】:2016-05-03 20:51:32
【问题描述】:

我想创建和保护工作簿。

这是我为保护所做的:

Sub Protege()
    Dim f As Worksheet
    Dim mdp As String

    mdp = InputBox("mdp est ?")

    For Each f In ActiveWorkbook.Worksheets
        f.Protect mdp, True, True, True
    Next f
End Sub

现在,这就是我为取消保护此工作簿所做的操作:

Sub unprotected()
    Dim f As Worksheet

    For Each f In ActiveWorkbook.Worksheets
        f.Unprotect
    Next f
End Sub

但我想先检查密码。我的意思是输入一个密码,看看它是否与真正的密码匹配。

【问题讨论】:

  • 密码不存储在任何地方,只是它的哈希值。而且您可以轻松编写一个嵌套循环,该循环总是会产生冲突的哈希并取消保护工作表。在任何地方存储明文密码是没有用的。你到底想达到什么目的?

标签: vba excel


【解决方案1】:

如果我理解正确,那么您可以通过尝试验证密码并在此过程中发现任何可能的错误:

Public Sub ProectSheet()

For Each ws In ThisWorkbook.Worksheets
    ws.Protect "pw"
Next ws

End Sub

Public Sub UnprotectSheets()

strPW = InputBox("PW?")
For Each ws In ThisWorkbook.Worksheets
    On Error GoTo WrongPassword
    ws.Unprotect strPW
Next ws
MsgBox "All sheets are now unprotected."

Exit Sub

WrongPassword:
    MsgBox "The password you entered is incorrect."
    Exit Sub

End Sub

【讨论】:

    【解决方案2】:

    除了尝试使用该密码取消对工作表的保护之外,无法测试工作表密码。

    只需执行f.Unprotect mdp,尽管如果mdp 包含无效密码,您可能会收到运行时错误,您可能应该捕获:

    For Each f In ActiveWorkbook.Worksheets
        On Error Resume Next
            f.Unprotect mdp
            lngError = Err
        On Error GoTo 0
        If lngError <> 0 Then MsgBox "Mauvais mdp !"
    Next f
    

    如果您只想测试提供的密码是否正确,但希望工作表仍然受到保护,您可以在之后再次保护它:

    For Each f In ActiveWorkbook.Worksheets
        On Error Resume Next
            f.Unprotect mdp
            lngError = Err
        On Error GoTo 0
        If lngError = 0 Then
            f.Protect mdp, True, True, True
        Else
            MsgBox "Mauvais mdp !"
        End If
    Next f
    

    请记住,正如 Mat's Mug 在 cmets 中提到的那样,匹配密码的数量是无限的,因为您只需要创建一个与原始密码具有相同哈希值的密码即可。这很容易。

    您永远不应该期望表单保护可以防止不知道密码的人。它很容易被规避。

    【讨论】:

      猜你喜欢
      • 2023-03-18
      • 2019-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-04
      • 1970-01-01
      相关资源
      最近更新 更多