Abra uma chave de registro para gravar usando create
:
pub fn main() -> Result<(), windows::core::Error> {
let auto_start = windows_registry::CURRENT_USER.create("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run")?;
auto_start.set_value("Test", &windows_registry::Value::from("content"))?;
Ok(())
}
Isso funciona como esperado (create apenas abre a chave como ela já existe, e o valor é adicionado).
Entretanto, como a chave já existe, eu gostaria de simplesmente abri-la, por exemplo, como o seguinte:
fn main() -> Result<(), windows::core::Error> {
let auto_start = windows_registry::CURRENT_USER.open("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run")?;
auto_start.set_value("Test", &windows_registry::Value::from("content"))?;
Ok(())
}
No entanto, ele falha com um erro de acesso negado, mesmo se eu executar o programa em um terminal iniciado com "Executar como administrador":
Erro: Erro { código: HRESULT(0x80070005), mensagem: "Acesso negado." }
Por que isso acontece?
Não deveria open
precisar no máximo das mesmas permissões que create
?
E por que isso nem funciona em um terminal elevado?
Curiosamente, basta abrir sem definir um valor...
As funções
Key::open()
eKey::create()
são otimizadas para ergonomia. Elas abrangem os dois padrões de acesso mais comuns:open()
uma chave para ler seus valorescreate()
uma chave para armazenar valoresO acesso solicitado é codificado como
KEY_READ
eKEY_READ | KEY_WRITE
, respectivamente. Se vocêopen()
digitar - em uma chave e, em seguida, tentar escrever um valor, a chamada falhará. É assim que o sistema e a caixa foram projetados para funcionar.Se precisar de uma chave para escrever, você terá que solicitar
KEY_WRITE
permissões. A maneira mais simples de obtê-la é chamandocreate()
no lugar deopen()
. Observe a documentação :Notavelmente, ele abre uma chave existente para
KEY_READ | KEY_WRITE
acesso.Se precisar de mais controle, você obterá um
OpenOptions
from 1 . O código a seguir abre explicitamente uma chave para acesso de leitura/gravação:Key::options()
Isso tem comportamento idêntico,
Key::create()
exceto que falha se a chave ainda não existir.Vamos abordar as questões restantes:
open
não precisa de nenhuma permissão. Isso é um requisito do seu programa, não da API. Se precisar de certas permissões, agora você sabe como solicitá-las.Ao solicitar permissões de leitura, qualquer outro acesso é rejeitado. Não faz diferença se uma solicitação de mais permissões teria sido bem-sucedida. A única coisa que muda ao alternar para um prompt de comando elevado é que o código que solicita acesso de gravação ao
LOCAL_MACHINE
hive, por exemplo, é bem-sucedido quando falha em uma conta de usuário comum.Sim, claro. É assim que o sistema foi projetado. Você também pode ler essa chave. E você pode abrir uma chave sem ter permissão de leitura, tudo bem, se não solicitar nenhuma.
1 Isso foi introduzido na versão 0.5.0; aqui está o PR que explica as escolhas de design.