Pergunta

Eu voltei a essa pergunta aqui porque as pessoas do Serverfault considerado que este é o lugar apropriado para perguntar isso.

Estou tentando impedir que as pessoas entrem em um único computador e use meu aplicativo simultaneamente. Em outras palavras, quero impedir que ele funcione duas vezes no mesmo computador; ao mesmo tempo, em qualquer momento, haverá apenas um único usuário executando meu aplicativo.

Há uma razão para eu definir o uso de licença que rigoroso; Meu aplicativo serve um mercado muito especializado e muito nicho. Portanto, cada cópia custa cerca de dezenas de milhares. Se tais múltiplas múltiplos login de login ganharem destaque, eu seria desligado em pouco tempo.

Isso ocorre porque eu quero impedi -los de comprar uma licença, instalá -la em uma máquina e usar certas tecnologias remotas de desktop para fazer o login de vários usuários. Eu quero impedi -los de violar o contrato de licença tecnologicamente, em vez de aplicação da lei.

Existe alguma maneira que eu possa fazer no meu aplicativo para isso? Ou o login múltiplo simultaneamente não é possível?

Eu preferiria uma solução não-dongle. Meu aplicativo é executado apenas no Windows.

Editar: Para complicar ainda mais o assunto, permito acesso simultâneo à versão diferente (meus clientes podem instalar várias versão do mesmo software em uma máquina e dispará -los ao mesmo tempo). Só não permito login remoto simultâneo.

Foi útil?

Solução

Deixe -me esclarecer um pouco do meu ponto de vista. Pelo menos Silky e eu parecemos interpretar isso de uma maneira diferente.

Pelo que entendi, você está tentando impedir que vários usuários (ou mais instâncias do mesmo usuário) faça login a máquina ao mesmo tempo. Nisso você assume que o único propósito da máquina é executar seu aplicativo, o que geralmente não será o caso.

Usar a abordagem de Silky (mutex em todo o sistema) para impedir que várias instâncias sejam executadas na mesma máquina é aceitável. Pessoalmente, eu gostaria de ter certeza de que não há um caso de uso válido para um único usuário executando duas instâncias do seu aplicativo para realizar uma tarefa, antes de adotar essa abordagem.

Veja também isso Pet Peeve do programador. Impedir que vários usuários usem a mesma máquina cai na mesma categoria;)

Quanto ao seu problema de versão múltipla: escolha um nome exclusivo para o seu Mutex em todo o sistema para cada versão (principal?) Do seu aplicativo.

Exemplo básico com um mutex em todo o sistema:

static class Program
{
    private static Mutex appMutex = new Mutex(false, "Global\\MyApp 1.0");

    [STAThread]
    static void Main()
    {
        if (!appMutex.WaitOne(0))
        {
            MessageBox.Show("Application is already running. Have a nice day.");
            return;
        }

        // ...
    }
}

o Global\ O prefixo faz o mutex compartilhado em várias sessões de servidor de terminal. Sem ele, isso apenas impediria o usuário de executar duas instâncias na mesma sessão.

Você deve testar essa abordagem em uma conta que possui direitos limitados, pois pode ser possível que as contas restritas não possam criar um mutex.

Outras dicas

Você quer impedir que corrida duas vezes no mesmo computador?

Se for esse o caso, a solução pode ser bastante simples; Retire um mutex em todo o sistema ou uma abordagem semelhante e, em seguida, verifique isso e verifique se ele ainda não existe. Você pode abrir um soquete, ou qualquer outra coisa, para conseguir isso.

Ou você deseja interromper de alguma forma uma conta, além da que a instalou, executando -a?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top