【问题标题】:Protect excel Of the method vba hard drive serial number保护excel的方法vba硬盘序列号
【发布时间】:2020-10-11 02:38:50
【问题描述】:

我的 vba 代码是

Public Function notHDD()

Dim m As String
Const test = "WD-WX22AAAAAA"

m = GetHDD

If m <> test Then
    notHDD = True
Else
    notHDD = False
End If

End Function

Function GetHDD() As String
    Dim Wmi As Object, Disks As Object, Disk As Object
    Set Wmi = GetObject("winmgmts:{impersonationLevel" & "=impersonate}!root\cimv2")
    Set Disks = Wmi.ExecQuery("Select * from Win32_DiskDrive")
    For Each Disk In Disks
    If Len(Disk.SerialNumber) > Len(GetSerialNumber) Then GetSerialNumber = Disk.SerialNumber
    Next
    Set Disk = Nothing
    Set Disks = Nothing
    Set Wmi = Nothing
GetHDD = GetSerialNumber
End Function


Private Sub Workbook_Open()

If notHDD Then
    ThisWorkbook.Close
End If

End Sub

为什么这段代码不起作用?

我只想要此操作系统硬盘序列号 WD-WX22AAAAAA 上的 Excel 文件

在除此之外的系统上关闭

【问题讨论】:

  • 始终更具体地了解您的代码是如何不工作的?语法错误,编译错误,编译正常但答案错误?
  • @我想被vba锁定,硬盘序列号

标签: excel vba


【解决方案1】:

在 DOS 提示符 cscript -nologo WMIC_DiskDrive.vbs 中运行此脚本。它是否打印出磁盘序列号(应该)?类似的代码应该在 Excel VBA 脚本宏中工作。

' Look disks
' cscript -nologo scriptname.vbs
Option Explicit

Dim StdOut: Set StdOut = WScript.StdOut

Dim oWmi: Set oWmi    = GetObject("winMgmts:{impersonationLevel=impersonate}!\\.\Root\CIMv2")
Dim oDisks: Set oDisks= oWmi.ExecQuery("Select * from Win32_DiskDrive")
Dim idx
Dim oItem

for idx=0 to oDisks.count-1
  Set oItem = oDisks.ItemIndex(idx)
  StdOut.writeLine(idx & "=" & oItem.SerialNumber)
next

这是 Excel VBA 测试宏,它会打印出磁盘序列吗?将值与您的预定义变量进行比较。序列号可能有空格字母。

Public Sub DiskDrives()
    Dim ws As Worksheet
    Dim oWmi As Object
    Dim oDisks As Object
    Dim oItem As Object
    Dim idx As Long
    
    Set ws = Application.ActiveSheet
    
    Set oWmi = GetObject("winMgmts:{impersonationLevel=impersonate}!\\.\Root\CIMv2")
    Set oDisks = oWmi.ExecQuery("Select * from Win32_DiskDrive")
    For idx = 0 To oDisks.Count - 1
        Set oItem = oDisks.ItemIndex(idx)
        Debug.Print ("|" & idx & "=" & oItem.SerialNumber & "|")
        ws.Cells(4 + idx, 1).Value = "Disk " & idx
        ws.Cells(4 + idx, 2).Value = "|" & oItem.SerialNumber & "|"
    Next
End Sub

【讨论】:

  • 不起作用。 Function GetHDD() As String Dim ws As Worksheet Dim oWmi As Object Dim oDisks As Object Dim oItem As Object Dim idx As Long
  • Set ws = Application.ActiveSheet Set oWmi = GetObject("winMgmts:{impersonationLevel=impersonate}!\\.\Root\CIMv2") Set oDisks = oWmi.ExecQuery("Select * from Win32_DiskDrive") For idx = 0 To oDisks.Count - 1 Set oItem = oDisks.ItemIndex(idx) Debug.Print ("|" &amp; idx &amp; "=" &amp; oItem.SerialNumber &amp; "|") ws.Cells(4 + idx, 1).Value = "Disk " &amp; idx ws.Cells(4 + idx, 2).Value = "|" &amp; oItem.SerialNumber &amp; "|" Next GetHDD = GetSerialNumber End Function
  • 运行我的示例 vba 宏代码(将其绑定到工作表上的按钮)并检查打印出的硬盘序列号,你得到值了吗?
  • 请查看此页面并帮助我stackoverflow.com/questions/64287594/…
  • 我相信已经给出了足够的答案和示例代码来学习。如果仍然无法做到这一点,您可能需要开发人员的帮助。只需运行我的示例 DOS vbs 脚本和 Excel vba 宏,无需任何更改。如果您没有看到连续剧,没有错误消息,那么我们无能为力,您需要学习更多。
猜你喜欢
  • 2010-09-24
  • 2010-10-15
  • 2011-08-06
  • 1970-01-01
  • 2011-05-04
  • 1970-01-01
  • 2010-12-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多