每个应用程序部署的唯一“代码”

时间:2008-12-23 21:12:12

标签: c# winforms

我们正在开发一个我们想要部署到某些用户机器的WinForm应用程序。我们希望使用某种“代码”来唯一标识安装的每个应用程序,我们可以在他们的系统上安装之前定义这些“代码”。

现在我们计划将唯一代码(我们自己键入)放在xml或文本文件中,让应用程序在安装时读取它。应用程序将在安装后删除该文件并将其保存在某处。

我们希望能够自己输入代码,以便我们可以跟踪,但有没有更好的方法,而不是将其放在某种平面文件中并让应用程序在安装后将其删除?

5 个答案:

答案 0 :(得分:1)

在MSI安装程序中添加自定义操作,动态生成GUID并将其存储在注册表中。然后,程序将在必要时访问该注册表项。

答案 1 :(得分:1)

如果您使用MSI安装应用程序,您可以编辑每个MSI以包含特殊代码,并将其作为安装的一部分写入注册表。

您可以使用ORCA手动编辑MSI - 您甚至可以使用脚本访问MSI并更改其中的值,这样您就可以编写一个小应用程序来完成它的这一部分。

否则,您可以将其加密到配置文件本身并在启动时输入。

如果没有更多信息,在这里帮忙是非常棘手的。

我使用此脚本(WiRunSQL.vbs)来访问MSI

' Windows Installer utility to execute SQL statements against an installer database
' For use with Windows Scripting Host, CScript.exe or WScript.exe
' Copyright (c) 1999-2001, Microsoft Corporation
' Demonstrates the script-driven database queries and updates
'
Option Explicit

Const msiOpenDatabaseModeReadOnly = 0
Const msiOpenDatabaseModeTransact = 1

Dim argNum, argCount:argCount = Wscript.Arguments.Count
If (argCount < 2) Then
    Wscript.Echo "Windows Installer utility to execute SQL queries against an installer database." &_
        vbLf & " The 1st argument specifies the path to the MSI database, relative or full path" &_
        vbLf & " Subsequent arguments specify SQL queries to execute - must be in double quotes" &_
        vbLf & " SELECT queries will display the rows of the result list specified in the query" &_
        vbLf & " Binary data columns selected by a query will not be displayed" &_
        vblf &_
        vblf & "Copyright (C) Microsoft Corporation, 1999-2001.  All rights reserved."
    Wscript.Quit 1
End If

' Scan arguments for valid SQL keyword and to determine if any update operations
Dim openMode : openMode = msiOpenDatabaseModeReadOnly
For argNum = 1 To argCount - 1
    Dim keyword : keyword = Wscript.Arguments(argNum)
    Dim keywordLen : keywordLen = InStr(1, keyword, " ", vbTextCompare)
    If (keywordLen) Then keyword = UCase(Left(keyword, keywordLen - 1))
    If InStr(1, "UPDATE INSERT DELETE CREATE ALTER DROP", keyword, vbTextCompare) Then
        openMode = msiOpenDatabaseModeTransact
    ElseIf keyword <> "SELECT" Then
        Fail "Invalid SQL statement type: " & keyword
    End If
Next

' Connect to Windows installer object
On Error Resume Next
Dim installer : Set installer = Nothing
Set installer = Wscript.CreateObject("WindowsInstaller.Installer") : CheckError

' Open database
Dim databasePath:databasePath = Wscript.Arguments(0)
Dim database : Set database = installer.OpenDatabase(databasePath, openMode) : CheckError

' Process SQL statements
Dim query, view, record, message, rowData, columnCount, delim, column
For argNum = 1 To argCount - 1
    query = Wscript.Arguments(argNum)
    Set view = database.OpenView(query) : CheckError
    view.Execute : CheckError
    If Ucase(Left(query, 6)) = "SELECT" Then
        Do
            Set record = view.Fetch
            If record Is Nothing Then Exit Do
            columnCount = record.FieldCount
            rowData = Empty
            delim = "  "
            For column = 1 To columnCount
                If column = columnCount Then delim = vbLf
                rowData = rowData & record.StringData(column) & delim
            Next
            message = message & rowData
        Loop
    End If
Next
If openMode = msiOpenDatabaseModeTransact Then database.Commit
If Not IsEmpty(message) Then Wscript.Echo message
Wscript.Quit 0

Sub CheckError
    Dim message, errRec
    If Err = 0 Then Exit Sub
    message = Err.Source & " " & Hex(Err) & ": " & Err.Description
    If Not installer Is Nothing Then
        Set errRec = installer.LastErrorRecord
        If Not errRec Is Nothing Then message = message & vbLf & errRec.FormatText
    End If
    Fail message
End Sub

Sub Fail(message)
    Wscript.Echo message
    Wscript.Quit 2
End Sub

我称之为。

wscript D:\Scripts\wirunsql.vbs D:\MSI\msiName.msi "Update ISProductConfigurationProperty Set Value = 'Name of my Product' WHERE (Property = 'ProductName')"

答案 2 :(得分:1)

我建议您使用NSIS(Nullsoft安装系统)进行设置,并在安装脚本中设置一个变量,该变量在安装时保存在注册表中。

NSIS脚本中的变量可以在编译时使用特殊的命令行开关定义。这样就可以创建一个轻量级的c#或vb.net应用程序,它接受您选择的唯一ID,并构建一个嵌入了ID的安装。

这样,只需点击一下即可为客户创建新安装。您还可以将.NET构建应用程序连接到SQL Express数据库(或等效的),并自动保存客户ID以供日后使用。

答案 3 :(得分:0)

就个人而言,如果我打算写一个这样的方案,我会有一个应用程序在第一次运行时检查的服务器。服务器将为计算机生成一个ID(可能是GUID),然后客户端应用程序将保存该ID。

如果使用这样的方案,在安装时手动执行此操作可能不太可能,但是没有理由说服务器无法保留安装了应用程序的计算机目录,如果这是执行此操作的唯一原因手动

答案 4 :(得分:0)

您可以使用主网卡的MAC ID,系统驱动器的序列号或其某些组合。 如果您可以完全控制用户的计算机,那么CPUID也可能是合适的。

这取决于您对用户的信任程度。如果ID主要用于识别,则上述操作将起作用。 如果它适用于某种安全系统或包含其他信息(例如,应用程序中的哪些功能可以打开),那么某种基于服务器或基于Active Directory的解决方案(假设内部网环境)可能会更好。