Уникальный «код» для каждого развертывания приложения - PullRequest
2 голосов
/ 24 декабря 2008

Мы разрабатываем приложение WinForm, которое мы хотим развернуть на компьютере определенного пользователя. Мы хотели бы однозначно идентифицировать каждое установленное приложение с помощью своего рода «кода», который мы можем определить перед установкой в ​​их систему.

Прямо сейчас мы планируем поместить уникальный код (который мы сами набираем) в xml или текстовый файл и заставить приложение читать его при установке. Приложение установит этот файл после установки и сохранит его где-нибудь.

Мы хотим иметь возможность набирать этот код самостоятельно, чтобы мы могли отслеживать, но есть ли смысл делать это вместо того, чтобы помещать его в какой-то плоский файл и удалять приложение после установки?

Ответы [ 5 ]

1 голос
/ 27 декабря 2008

Я бы порекомендовал использовать NSIS (Nullsoft Install System) для вашей настройки и установить переменную внутри вашего установочного скрипта, которая будет сохранять реестр где-то после установки.

Переменные внутри скриптов NSIS могут быть определены при компиляции с помощью специального переключателя командной строки. Это позволяет создать облегченное приложение на c # или vb.net, которое принимает уникальный идентификатор по вашему выбору и создает установку со встроенным идентификатором.

Таким образом, для создания новой установки для клиента достаточно одного клика. Вы также можете подключить свое приложение сборки .NET к базе данных SQL Express (или эквивалентной) и автоматически сохранить идентификатор клиента для дальнейшего использования.

1 голос
/ 24 декабря 2008

Если вы используете 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')"
1 голос
/ 24 декабря 2008

Добавьте пользовательское действие в установщик MSI, который генерирует GUID на лету и сохраняет его в реестре. Затем программа получит доступ к этой записи реестра при необходимости.

0 голосов
/ 24 декабря 2008

Вы можете использовать MAC-идентификатор основной сетевой карты, серийный номер системного диска или их комбинацию. Если у вас есть полный контроль над машинами пользователей, то может подойти и CPUID.

Это зависит от того, насколько вы доверяете своим пользователям. Если идентификатор предназначен в первую очередь для идентификации, то вышеописанное будет работать. Если это для какой-то системы безопасности или содержит дополнительную информацию (например, какие функции в приложении нужно включить), то какое-то решение на основе сервера или Active Directory (с учетом среды интрасети), вероятно, будет лучше.

0 голосов
/ 24 декабря 2008

Лично, если бы я собирался написать такую ​​схему, у меня был бы сервер, с которым приложение проверяло бы при первом запуске. Сервер сгенерирует для компьютера идентификатор (вероятно, GUID), который клиентское приложение затем сохранит.

Выполнение этого вручную во время установки, вероятно, маловероятно, если использовать такую ​​схему, но нет причины, по которой сервер не может хранить каталог компьютеров с установленным для вас приложением, если это единственная причина для этого вручную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...