Chaves de registro indisponíveis para o aplicativo sendo executado de um serviço

2

Estamos escrevendo um aplicativo personalizado de serviço do Windows. O serviço está configurado para permitir a interação com a área de trabalho, e o aplicativo de serviço precisará executar outro aplicativo "normal". O serviço está configurado para iniciar e executar com uma conta de usuário normal do Windows, não a conta do sistema.

O problema que estamos tendo é que, quando o serviço chama o outro aplicativo normal, parece que o registro não está sendo carregado como está quando a conta do usuário em que o serviço está sendo executado entra em janelas. Especificamente, o aplicativo está lançando um erro de que certas chaves do Registro não estão disponíveis.

Por que a conta que está executando o serviço não está recebendo o registro completo que as mesmas contas de usuário recebem quando se registra no mesmo sistema Windows? Pode alguma coisa ser feita para mudar isso?

    
por Richard West 15.09.2011 / 22:56

2 respostas

1

Contas de serviço não carregam o perfil de usuário, portanto, não têm acesso a uma seção de registro HKCU. As configurações de tais serviços devem ser mantidas no HKLM com as configurações de segurança apropriadas colocadas nas chaves, conforme necessário. No entanto, se o perfil for carregado no sistema, ele deve existir em algum lugar abaixo de HKU se você for procurá-lo.

    
por 15.09.2011 / 23:31
0

Eu acho que há algo mais acontecendo aqui.

O usuário está logado ao mesmo tempo que o serviço? Em caso afirmativo, a seção do Registro pode ser bloqueada. Há alguma mensagem no log de eventos do Windows?

A razão que eu acho que o aplicativo deve ser capaz de acessar o registro HKEY_CURRENT_USER é porque eu testei isso e criei um exemplo do serviço C # Windows (código abaixo, se estiver interessado).

Os aplicativos projetados para serem executados como um serviço não devem, entretanto, armazenar suas informações em uma seção de registro HKCU. O HKLM é o local correto para configurações de aplicativos em todo o sistema.

Testes realizados

Criei uma nova conta de usuário com acesso administrativo no Windows 7. Em seguida, concedeu a ela Logon como direitos de serviço, instalei e iniciei o serviço.

Meus achados foram: * Quando eu corri o serviço, HKCU foi carregado e capaz de ser gravado. * Quando a colmeia já estava carregada, recebi esta mensagem no log de eventos e a seção real não foi atualizada. Em vez disso, uma seção temporária foi criada.

Windows was unable to load the registry. This problem is often caused by insufficient memory or insufficient security rights.

DETAIL - The process cannot access the file because it is being used by another process. for C:\Users\OtherService\ntuser.dat

Além disso, link e aqui link indica que mesmo as contas padrão do sistema têm uma seção de registro que é carregada no HKCU, embora possa ser compartilhado.

Código para o serviço de teste

public partial class ExecuterSvc : ServiceBase
{
    public ExecuterSvc()
    {
        InitializeComponent();
    }

    protected override void OnStart(string[] args)
    {
        TagRegistryHive("Tag", "Written");
    }

    protected override void OnStop()
    {

    }

    public void TagRegistryHive(string KeyName, object Value)
    {
        try
        {
            // Load the hive.
            var rk = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Default);

            rk.SetValue(KeyName.ToUpper(), Value);
        }
        catch (Exception e)
        {

        }
    }
}
    
por 16.09.2011 / 01:05