Newsgroup: it.comp.lang.delphi
Titolo: Vedete errori ?

La seguente istruzione, eseguita correttamente in ambiente Windows 7, 
fallisce in esecuzione dopo l'aggiornamento a Windows 10:
 
    RegIniFile.RootKey := HKEY_LOCAL_MACHINE;
    RegIniFile.WriteString('Software\Microsoft\Windows\' +
                       'CurrentVersion\Run'#0, 'Schedule', 
'D:\Documenti\Schedule\Schedule.exe');
 
Il messaggio di errore č: ...failed to create 
Software\Microsoft\Windows\CurrentVersion\Run
 
Mi sono accorto che dopo l'aggiornamento a Windows 10, il riferimento nella 
chiave Run dell'applicazione Schedule.exe che prima c'era, č sparita. e 
quindi ho rieseguito il programma che con le suddette istruzioni 
provvedevano in Windows 7 alla scrittura.
La chiave sul registro c'č. Non riesco a vedere l'errore. Sapete aiutarmi ?
 
 
---
Questa e-mail č stata controllata per individuare virus con Avast antivirus.
https://www.avast.com/antivirus
 
 

 La chiave sul registro c'č. Non riesco a vedere l'errore. Sapete aiutarmi ?
 
Onestamente non ho capito, Puoi spiegarti meglio?
 
A.


 La chiave sul registro c'č. Non riesco a vedere l'errore. Sapete aiutarmi ?
 
La butto li... e' possibile che da windows 7 a 10 hanno ulteriormente ristretto l'accesso a zone delicate di windows (come stanno facendo da XP in poi... :-) 
Oltre alle cartelle su disco e' probabile che abbiano protetto anche HKEY_LOCAL_MACHINE.
 
Prova a eseguire come amministratore con diritti elevati. 
 
ciao
Giacomo

 fallisce in esecuzione dopo l'aggiornamento a Windows 10 [...]
 
Per scrivere in quella chiave, l'applicazione deve essere eseguita con privilegi amministrativi.
 
Sei sicuro di non aver attribuito "privilegi speciali" alla tua applicazione nell'ambiente Windows 7 che non hai poi replicato in seguito aggiornando al 10?
 
Ciao,
  Marco.
 
-- 
MARCO BREVEGLIERI (Software and Web Developer)
 #Home: 
http://www.marco.breveglieri.name
 
 #Blog: 
http://www.compilaquindiva.com
 
 #DelphiPodcast: 
http://www.delphipodcast.com
 

 
https://www.avast.com/antivirus
 
 
 
---
Questa e-mail è stata controllata per individuare virus con Avast antivirus.
https://www.avast.com/antivirus
 
 

"Marco Breveglieri"  ha scritto nel messaggio 
news:ff622f2a-0e76-4c0e...@googlegroups.com...
Per scrivere in quella chiave, l'applicazione deve essere eseguita con 
privilegi amministrativi.
Sei sicuro di non aver attribuito "privilegi speciali" alla tua applicazione 
nell'ambiente Windows 7 che non hai poi replicato in seguito aggiornando al 
10?
Ciao,
  Marco.
-- 
No, non sono sicuro di niente perchč non so come si attribuiscono privilegi 
speciali da programma. Io eseguivo semplicemente una procedura che con le 
istruzioni che ho mostrato si occupava (con successo in Windows 7) di 
mettere quei dati in quella chiave di Windows.
Possibile che nessuno abbia questa esigenza e non possa mostrarmi come fa ? 
Sono troppo inesperto per fare diversamente da come sapevo si faceva ... 


descritto.
 
Non può crearla perchè c'è già ?
controlla la presenza della chiave prima di crearla
oppure metti tutto in try except e controlla l'errore.

"jugin"  ha scritto nel messaggio 
news:cd9i0b17omkr6iad8...@4ax.com...
Non può crearla perchè c'è già ?
controlla la presenza della chiave prima di crearla
oppure metti tutto in try except e controlla l'errore.
---
No, io non creo la chiave, ma inserisco i miei dati sotto quella chiave già 
esistente. 


 ma purtroppo io non ci arrivo con la mia competenza
 
Allora è il momento di salire lo scalino e migliorare le competenze.
 
Il tempo passa e l'adeguamento delle competenze non è un certo un "nice to have" ma un "MUST".
 
Per la cronaca, io non ho competenze su android, e mo sto sbattendo la testa su android studio e su android stesso che come sistema operativo ha ben poco in comune con winzozz.
 
 
A.

 Sono troppo inesperto per fare diversamente da come sapevo si faceva ... 
 
Se sei "troppo inesperto", però, ti devi documentare, perché una mano la si può dare tranquillamente all'interno di un gruppo o di un forum, però ovviamente non si può né fare la cosa al posto tuo, né spiegarti tutto il background che sta dietro lo sviluppo Windows. :)


"Alberto Salvati"  ha scritto nel messaggio 
news:44183961-5fef-4269...@googlegroups.com...
Ci sono 3 casi:
1) sono cose tue e di nessun altro
Io eviteri l'uso del registry in favore di altre soluzioni.
Che sia INI, XML, o file che definisci tu poco importa
2) sono chiavi di SISTEMA di windows
Per queste, nei casi che ho dovuto gestire io, tramite api si becca tutto.
Ad esempio, i servizi installati sono scritti nel registry, ma con le api 
SCM (Service Control Manager) fai tutto e ti eviti eventuali casini legati a 
spostamenti di chiavi.
3) sono chiavi di altri software
Qua secondo me tocca andare a mano via registry e buonanote
Tu in qualche di questi 3 casi rientri e xche devi farlo?
A.
----
Intanto voglio dire che apprezzo il tempo spesa nel darmi consigli. 
Sicuramente non ho spiegato bene l'obiettivo della proc che non funziona più 
e quindi tento di farlo di nuovo.
Ho un'applicazione che uso da tanto tempo che desidero che parta all'avvio 
di Windows (quando ricorrono le condizioni dà dei segnali aprendo un form, 
altrimenti si chiude e basta senza apparire).
Perchè parta con Windows, potevo manualmente modificare il registro di 
Windows introducendo una riga di dati sotto la chiave Run o RunOnce. Invece 
l'ho fatto in modo programmatico e la proc in questione si occupa di 
aggiungere questa riga.
 
Quindi l'obiettivo è di far partire una piccola applicazione all'avvio di 
Windows. Per farlo non so altri modi se non mettere i dati relativi nel 
registro Windows. Per farlo da programma, non so altro modo di quello che ho 
fatto. Non funziona più. Le domande sono: come fare in Win 10 quello che 
facevo in Win 7 ? Oppure: come si può fare altrimenti per raggiungere lo 
stesso risultato ?


"Marco Breveglieri"  ha scritto nel messaggio 
news:ac76ffa6-f732-4df1...@googlegroups.com...
Se sei "troppo inesperto", però, ti devi documentare, perché una mano la si 
può dare tranquillamente all'interno di un gruppo o di un forum, però 
ovviamente non si può né fare la cosa al posto tuo, né spiegarti tutto il 
background che sta dietro lo sviluppo Windows. :)
-- 
Guarda che mi sono documentato ! E' scavando su come potevo fare che l'ho 
fatto a suo tempo. Ora sto tentando di capire perchè aggiornando a Windows 
10 il congegno non funziona più.
Mi sono detto: non sarò l'unico ad avere l'esigenza di far partire un 
programma all'avvio di Windows ? La mia procedura non fa altro che 
provvedere a mettere i riferimenti all'applicazione nelle chiavi Run e/o 
RunOnce del registro di Windows.
Se non funziona, qualcuno magari avrà scoperto perchè e può condividere la 
cosa con gli altri. Io non ci sono riuscito. 
 
 
---
Questa e-mail è stata controllata per individuare virus con Avast antivirus.
https://www.avast.com/antivirus
 
 


 
Crea un collegamento al programma da eseguire all'avvio di Windows e 
mettilo in questa cartella:
 
C:\Users\Luigi\%Nome Utente%\Roaming\Microsoft\Windows\Start 
Menu\Programs\Startup
 
%Nome utente% cambialo con il nome dell'utente registrato di windows.
 
Ciao.


 
Proverei eliminando lo Zero: #0,  non l'ho mai usato, Giorgio
 

 
Detesto l'idea di una APPLICAZIONE in autorun all'avvio.
Non so voi ma io cerco per quanto possibile di disattivarle.
Chi, tra i frequentatori del ng non ha lo splendido ricordo della mitica barra di office????
 
Ovviamente (ma non per tutti), ora io proverei le soluzioni che ti hanno suggerito e sperare che almeno una funzioni (sgrat sgrat).
 
Dovendo farla da zero io proverei cosi:
 
1) crei un SERVIZIO WINDOWS 
I servizi sono registrati, partono in automatico all'avvio, girano sotto l'utente system e quindi hanno accesso al sistema locale in toto.
La precisazione "locale" non è un caso.
L'utente system è locale, ergo, se sei in un domnio/active directory e il tuo servizio deve accedere ad esempio a file system non locali, ti fotti.
Nel caso il tuo servizio deve girare con un utente di rete. Va be...
 
2) ovviamente (ma non per tutti) il tuo servizio NON ha form nè interfaccia utente di qualsiasi tipo. Se per te questa cosa non è ovvia, documentati.
Il tuo servizio fa solo i check e le verifiche di cui parlavi.
Se hai necessità di mostrare una form all'utente:
 
a)  salvi i dati necessari al corretto funzionamento del form in un file di qualche tipo (magari salvato nella GIUSTA CARTELLA TEMPORANEA...) 
 
b) il nome di file sara' ovviamente (ma non per tutti) calcolato al volo e non cablato (secondo te perchè?)
 
c) lanci un exe passandogli come parametro il nome del file.
Questo tuo exe contiene SOLO il form che adesso è nel file exe che stai cercando di mettere in autorun.
 
A.

"Marco Breveglieri"  ha scritto nel messaggio 
news:ac76ffa6-f732-4df1...@googlegroups.com...
Fai clic sull'eseguibile con il tasto destro e scegli "Esegui come 
amministratore". Se il programma funziona correttamente, allora il problema 
è questo.
---
Provato. Non è questo. 
 
 
---
Questa e-mail è stata controllata per individuare virus con Avast antivirus.
https://www.avast.com/antivirus
 
 

 1) 2) a) b) c)
 
Complimenti, hai vinto il primo premio per la piu` grande cagata suggerita!
 

 Software\Microsoft\Windows\CurrentVersion\Run
 
Rileggendo il codice, forse c'è uno #0 di troppo che non dovrebbe essere necessario: non vorrei che influisse sulla creazione della chiave e magari impedisse di visualizzare lo stesso carattere nel messaggio che ottieni.
 
Se il parametro del metodo è di tipo *string*, non hai bisogno di "null terminarla". :)


 Proverei eliminando lo Zero: #0,  non l'ho mai usato, Giorgio
 
Accidenti, ho letto solo dopo questo suggerimento, ma mi sento di condividerlo ulteriormene visto che siamo in due a segnalarlo. :D


 per la piu` grande cagata suggerita!
 
Motivo?
 
A.
 

 Motivo?
 
Sarebbe troppo lungo spiegartelo. Spero davvero che non scrivi applicazioni come quella che hai suggerito.
 

 esistente. 
 
Hai provato con regedit a farlo manualmente? riesci ad aggiungere ?
(cosi' verifichiamo che non ci sia qualche problema di diritti di
accesso proprio sulla chiave di registry)
 
ciao
Giacomo

 Spero davvero che non scrivi applicazioni come quella che hai suggerito.
 
A differenza tua io sono qua, nel bene ma sopratutto nel male, con nome e cognome.
 
A.
 
 
 

 A differenza tua io sono qua, nel bene *ma sopratutto nel male*
 
Ecco appunto.
 
 

 A differenza tua io sono qua, nel bene *ma sopratutto nel male*
Ecco appunto.
---
Offensivo, senza ragione nè spiegazione. 


"Marco Breveglieri"  ha scritto nel messaggio 
news:2658fe81-78b5-4f14...@googlegroups.com...
Rileggendo il codice, forse c'è uno #0 di troppo che non dovrebbe essere 
necessario: non vorrei che influisse sulla creazione della chiave e magari 
impedisse di visualizzare lo stesso carattere nel messaggio che ottieni.
Se il parametro del metodo è di tipo *string*, non hai bisogno di "null 
terminarla". :)
-- 
Grazie dei suggerimenti ! Purtroppo non è questo. Avevo tentato sia di usare 
una stringa senza #0, sia di aggiornare il registro a mano, cosa che mi 
lascia fare tranquillamente.. 
 
 
---
Questa e-mail è stata controllata per individuare virus con Avast antivirus.
https://www.avast.com/antivirus
 
 

"Giacomo Degli Esposti"  ha scritto nel messaggio 
news:9f2147b6-11f7-494c...@googlegroups.com...
Hai provato con regedit a farlo manualmente? riesci ad aggiungere ?
(cosi' verifichiamo che non ci sia qualche problema di diritti di
accesso proprio sulla chiave di registry)
ciao
Giacomo
--
Si, si, provato. L'ho fatto senza problemi ... 


 lascia fare tranquillamente.. 
 
Ma se tu provassi a caricare il sorgente del progetto da qualche parte, così possiamo verificare direttamente l'implementazione nel suo insieme?


 Offensivo, senza ragione nè spiegazione. 
 
E` semplicemente la verita`.

> Offensivo, senza ragione nè spiegazione. 
 
Guarda e passa.
 
Tornando al tuo problema, se da regedit a mano ci riesci allora è quasi certo che sia un problema di permissions.
Hai provato a eseguire la tua applicazione forzandone l'esecuzione come amministratore?
Se si, ha funzionato?
 
A.

"Alberto Salvati"  ha scritto nel messaggio 
news:b34dfdac-e4c0-4012...@googlegroups.com...
Tornando al tuo problema, se da regedit a mano ci riesci allora è quasi 
certo che sia un problema di permissions.
Hai provato a eseguire la tua applicazione forzandone l'esecuzione come 
amministratore?
Se si, ha funzionato?
A.
----
Si, ho provato, ma dà lo stesso errore. Su un altro computer dove ho Windows 
7 installato, continua a funzionare regolarmente.


Ma il tuo exe è a 32 bit?
 
A.

Ma se tu provassi a caricare il sorgente del progetto da qualche parte, così 
possiamo verificare direttamente l'implementazione nel suo insieme?
-- 
Da qualche parte cosa intendi ? In attesa che tu mi chiarisca, provo a 
mettere il fulcro del codice qui sotto, con qualche spiegazione:
 
Il file di progetto dell'applicazione fa riferimento a un resource file:
{$R *.res $R Schedule.REC}
il cui source è il seguente:
 
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity version="1.1.1.1"
processorArchitecture="X86"
name="ScheduleChkP.exe"
type="win32"/>
<description>elevate execution level</description>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
 
Il main dell'applicazione offre all'utente l'opzione di fa partire 
l'applicazione automaticamente allo Start di Windows. Questo è il codice 
relativo:
 
 
procedure TFormScadenziario.RunOnWinStartClick(Sender: TObject);
begin
  if RunOnWinStart.Checked then
  begin
     // inserisci l'app sul Registro per essere avviata allo startup
     try
         if fileexists(ExtractFilePath(Application.ExeName) + 
'Schedule.exe') then
            RunOnStartUp('Schedule', ExtractFilePath(Application.ExeName) + 
'Schedule.exe', False);
         else
            RunOnWinStart.Checked:= false;
     except
         MessageDlg('Errore ...', mtInformation, [mbOk], 0);
     end;
  end else
  begin
     // rimuovere l'app dal Registro
     try
        RemoveFromRunKey('Schedule');
     except
        MessageDlg('Errore ...', mtInformation, [mbOk], 0);
     end;
  end;
end;
 
procedure RunOnStartup(ApTitle,CommandLn: String; RunOnce: Boolean);
var
  RegIniFile  : TRegIniFile;
begin
  //RegIniFile := TRegIniFile.Create('');
  RegIniFile := TRegIniFile.Create(KEY_READ);
 
  with RegIniFile do
  begin
    RootKey := HKEY_LOCAL_MACHINE;
    if RunOnce then
      RegIniFile.WriteString('Software\Microsoft\Windows\' +
                             'CurrentVersion\RunOnce'#0,
                              ApTitle, CommandLn)
    else
      RegIniFile.WriteString('Software\Microsoft\Windows\' +
                             'CurrentVersion\Run'#0,
                              ApTitle, CommandLn);
    Free;
  end;
end;
 
procedure RemoveFromRunKey(ApTitle: string);
var
  Reg: TRegistry;
  TheKey: string;
begin
  Reg := TRegistry.Create(KEY_READ);
  Reg.RootKey := HKEY_LOCAL_MACHINE;
  TheKey := 'Software\Microsoft\Windows\CurrentVersion\Run';
  if not Reg.OpenKey(TheKey, False) then
    ShowMessage('Key not found')
  else begin
    if Reg.DeleteValue(ApTitle) then
      ShowMessage('Removed: ' + ApTitle)
    else
      ShowMessage('Not found: ' + ApTitle);
  end;
  Reg.CloseKey;
  Reg.Free;
end;


"Alberto Salvati"  ha scritto nel messaggio 
news:b371b4ae-f8c2-4a75...@googlegroups.com...
Ma il tuo exe č a 32 bit?
---
Caspita, che domanda imbarazzante mi fai. Credo di si, ma non sono sicuro 
che vada da se con il fatto che uso Delphi Win32 ...
Intanto ho messo il codice in questione sotto l'ultima risposta di Marco 
Breveglieri... 
 
 
---
Questa e-mail č stata controllata per individuare virus con Avast antivirus.
https://www.avast.com/antivirus
 
 

                               ApTitle, CommandLn)
 
Prova a togliere KEY_READ oppure utilizzare KEY_ALL_ACCESS; 
conconrdo con il togliere a prescindere il #0.
 

   RegIniFile := TRegIniFile.Create(KEY_READ);
 
Se specifichi KEY_READ, ovviamente puoi solo leggere le chiavi, enumerare le sottochiavi e acquisirne i valori, ma non puoi scrivere: devi usare anche KEY_WRITE per fare questo.
 
Vedi qui i valori che puoi mettere e il loro significato:
https://msdn.microsoft.com/en-us/library/windows/desktop/ms724878%28v=vs.85%29.aspx
 
 
Ciao,
  Marco.


"Marco Breveglieri"  ha scritto nel messaggio 
news:f4a9d5b8-6f87-4c1b...@googlegroups.com...
Se specifichi KEY_READ, ovviamente puoi solo leggere le chiavi, enumerare le 
sottochiavi e acquisirne i valori, ma non puoi scrivere: devi usare anche 
KEY_WRITE per fare questo.
---
Comincio a vedere la luce, nel senso che ancora mi dà errore, ma eseguendolo 
come amministratore sembra ok.
Ora lo verifico direttamente nel registro, ma comunque come supero il 
problema UAC da programma ?
In Windows 7 tutto funzionava e pensavo che la risorsa 'Schedule.REC' 
servisse proprio allo scopo di superare lo scoglio UAC.
Come si fa in Windows 10 ? 


Penso che potrebbe essere il maifest ! Ho trovato un manifest per Windows 8 
che è un pò diverso dal quello che ho usato io e lo proverò.
Però nell'articolo che ho letto c'era un aggiunta che dice:
 
Next, add the following to your sources:
SXS_MANIFEST_RESOURCE_ID=1
SXS_MANIFEST=foo.manifest
SXS_ASSEMBLY_NAME=Microsoft.Windows.Foo
SXS_ASSEMBLY_VERSION=1.0
SXS_ASSEMBLY_LANGUAGE_INDEPENDENT=1
SXS_MANIFEST_IN_RESOURCES=1
 
Qualche idea su dove e come vanno messe queste righe ? 


 problema UAC da programma ?
 
Qual è di preciso il "problema UAC"? Il fatto che venga chiesta una conferma per eseguire un programma che tenta di modificare una voce del Registro è del tutto normale, e dubito che vi sia la possibilità di aggirarla (a meno di non disabilitare UAC sulla macchina).


"Marco Breveglieri"  ha scritto nel messaggio 
news:aa79e31d-a937-43d1...@googlegroups.com...
Qual è di preciso il "problema UAC"? Il fatto che venga chiesta una conferma 
per eseguire un programma che tenta di modificare una voce del Registro è 
del tutto normale, e dubito che vi sia la possibilità di aggirarla (a meno 
di non disabilitare UAC sulla macchina).
---
Non mi viene chiesta alcuna conferma, semplicemente quando uso la funzione 
del mio programma che dovrebbe inserire nel registro alla chiave 
"Software\Microsoft\Windows\CurrentVersion\Run" i riferimenti all'exe, la 
funzione fallisce con un messaggio di errore che dice: "... Failed to create 
key Software\Microsoft\Windows\CurrentVersion\Run."
 
Mi è stato suggerito che potrebbe essere un problema di UAC, e in effetti 
lanciando manualmente il programma con 'Esegui come amministratore', la 
funzione viene eseguita.
Il programma ha nelle sue risorse un manifest file che dovrebbe elevare i 
sui privilegi, ma sotto Windows 10 evidentemente non funziona.
Inoltre il messaggio si riferisce alla 'creazione' della key, mentre la 
funzione non crea la key, ma la riga dati dentro la key.. 


 Si, ho provato, ma dà lo stesso errore. 
 
Mi sono perso qualcosa?
 
A.

"Alberto Salvati"  ha scritto nel messaggio 
news:0976434e-ccfc-4d1e...@googlegroups.com...
Mi sono perso qualcosa?
A.
---
Non lo so perchč, ma sono sicuro di aver provato, lo so che non ci crederai 
. Probabilmente sto impazzendo e non ci capisco piů niente.
Adesso ho riprovato enne volte,  e se eseguo come amministratore funziona, 
altrimenti no.
La mia funzione inserisce i dati nel registro sotto HKEY_LOCAL_MACHINE, alla 
chiave Software\Microsoft\Windows\CurrentVersion\Run.
In Windows 7, i dati poi risultavano presenti anche nella chiave 
Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Run.
In Windows 10, facendo una ricerca ho visto che la prima chiave non c'č, ma 
i dati vengono messi correttamente nella seconda chiave anche se la funzione 
indica la prima.
Sono comunque al punto di partenza: il programma non parte piů allo startup 
di Windows e ormai ho scandagliato la rete e non ho trovato come fare. 
Eppure ne ho tanti e indesiderati che partono.. Quelli come fanno ? 
 
 
---
Questa e-mail č stata controllata per individuare virus con Avast antivirus.
https://www.avast.com/antivirus
 
 


wrote:
 
Ti è già stato suggerito ma puoi mettere il programma 
in esecuzione automatica oppure impostare : "esegui
come amministratore" nelle proprietà del tuo exe.
 
 

"jugin"  ha scritto nel messaggio 
news:4ii51bps4kh5i47bc...@4ax.com...
Ti è già stato suggerito ma puoi mettere il programma
in esecuzione automatica oppure impostare : "esegui
come amministratore" nelle proprietà del tuo exe.
---
Già, ma io voglio farlo via programma. Voglio che l'utente decida per conto 
suo e gli offro un'opzione per mettere il suo programma in esecuzione 
automatica e anche di rimuovere questa scelta. Vedo che non ne vengo fuori 
.. 
 
 
---
Questa e-mail è stata controllata per individuare virus con Avast antivirus.
https://www.avast.com/antivirus
 
 

 automatica e anche di rimuovere questa scelta. 
 
La tua app che chiede all'utente sta cosa DEVE girare on i diritti di amministratore, ihmo...Che sia via manifest o altro poco importa,
 
A.


"Alberto Salvati"  ha scritto nel messaggio 
news:26e9dfb5-beba-4832...@googlegroups.com...
La tua app che chiede all'utente sta cosa DEVE girare on i diritti di 
amministratore, ihmo...Che sia via manifest o altro poco importa,
A.
----
Come cosa importa ? E' qui il problema: questa app, in win7, si auto-eleva 
via manifest, e pertanto può modificare il registro per autoavviarsi allo 
startup di windows (per scelta utente, che può anche ritornare sui suoi 
passi).
 
In win 10 l'aggiornamento del registro avviene solo se l'utente avvia come 
amministratore (e lo stesso dovrà fare se vorrà cambiare idea).


 amministratore (e lo stesso dovrà fare se vorrà cambiare idea).
 
Ed è proprio così che deve essere (per fortuna). :)
