一旦我确定 Excel 安装在 Windows 上,我如何使用 vb.net 或 C# 以编程方式判断它是否是 licensed/registered 副本

Once I determine that Excel is installed on Windows, how can I programmatically tell if it is a licensed/registered copy using vb.net or C#

当我处理我的应用程序时,我的 Office 365 订阅已过期。该应用程序具有导出功能,如果已安装,可以将数据导出到 Excel,如果未安装,则可以将其作为格式化文本文档打开。

虽然订阅已过期,但仍然打开Excel。

有没有办法检查Excel是否是licensed/registered?

用于检查 Excel 安装的代码:

Dim regKey As Object = My.Computer.Registry.ClassesRoot.OpenSubKey("Excel.Application",  False).OpenSubKey("CurVer", False)
If regKey.GetValue("").ToString() Is Nothing Then
   Return False
Else
   Return True
End If

以下是Windows 10 box,Office 的位置是

C:\程序Files\MicrosoftOffice\Office16

简而言之,在将结果写入文件的异步方法中使用 Process.Start 调用 cscript.exe,然后 return 将字符串返回给调用者,后者检查是否 LICENSE STATUS: ---LICENSED--- 在字符串中,如果是这样,则许可证是好的。如果需要更多信息,请考虑而不是 returning 字符串 return 从文件中读取字符串数组并查询其他详细信息。

替代方法是使用 PowerShell,连接到 Azure,然后使用类似于下面的代码调用适当的 PowerShell 命令。 following 是 C#,显示使用 PowerShell,可以轻松转换为 VB 并遵循下面列出的相同模式..

进口System.IO

Public Class Operations
    Public Shared Async Function OfficeStatusAsync() As Task(Of String)

        Return Await Task.Run(Async Function()
                                  Const fileName = "office.txt"
                                  Const workingFolder = "C:\Program Files\Microsoft Office\Office16"

                                  If Not Directory.Exists(workingFolder) Then
                                      Return "Directory not found"
                                  End If

                                  If File.Exists(fileName) Then
                                      File.Delete(fileName)
                                  End If

                                  Dim start = New ProcessStartInfo With {
                    .FileName = "cscript.exe",
                    .UseShellExecute = False,
                    .RedirectStandardOutput = True,
                    .Arguments = "ospp.vbs /dstatus",
                    .CreateNoWindow = True,
                    .WorkingDirectory = workingFolder
                    }

                                  Using process As Process = Process.Start(start)
                                      Using reader = process.StandardOutput

                                          process.EnableRaisingEvents = True

                                          Dim result = Await reader.ReadToEndAsync()

                                          File.WriteAllText(fileName, result)
                                          process.WaitForExit()

                                          Return File.ReadAllText(fileName)

                                      End Using
                                  End Using

                              End Function)
    End Function

End Class

用法

Public Class Form1
    Private Async Sub RunButton_Click(sender As Object, e As EventArgs) Handles RunButton.Click
        Dim result = Await Operations.OfficeStatusAsync()
        If result = "Directory not found" Then
            MessageBox.Show("Incorrect folder")
            Return
        End If

        If result.Contains("LICENSE STATUS:  ---LICENSED---") Then
            MessageBox.Show("Good to go")
        Else
            MessageBox.Show("Licence expired")
        End If
    End Sub
End Class