Servizio Windows: posso configurare la directory di lavoro corrente?


11

Per impostazione predefinita, i servizi di Windows vengono avviati nella directory sytem32 (in genere C:\WINDOWS\system32).

C'è un modo per impostare una directory di lavoro diversa? Sto pensando ad alcuni parametri del registro di seguito HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SomeService.

Quindi - questo può essere fatto?


3
@Tomalak: è un servizio che hai scritto? Puoi farlo attraverso il codice, ma non credo che ci sia un modo per passare attraverso le impostazioni del servizio.
MattB,

No, non è un servizio che ho scritto. Speravo in qualche impostazione del registro poco conosciuta qui.
Tomalak,

Qual è lo scopo di farlo?
user35115

@ user35115: Beh, a dire il vero ... Durante il rintracciamento di un problema non correlato con procmon, ho notato che un certo servizio pesante I / O (un indicizzatore di testo completo) controlla costantemente i propri file in posizioni errate (piuttosto stupido). Inizia da system32, prova qualche altro percorso ed eventualmente la propria directory. Ho pensato che quando sarebbe stato eseguito nella sua directory immediatamente, avrebbe fatto meno controlli dei file non necessari. Non che al momento non funzionasse , eppure mi chiedevo se ci fosse spazio per miglioramenti.
Tomalak,

1
@ user35115, per evitare di dover modificare in massa le impostazioni di configurazione di una determinata app (ad esempio Apache, ecc.), tutte relative alla directory di lavoro.
Pacerier,

Risposte:


5

È possibile utilizzare l'iniezione DLL per chiamare SetCurrentDirectorydopo che il processo è già stato avviato. Ciò richiederebbe di creare un'applicazione iniettore, oltre alla DLL da iniettare. Esistono alcuni tutorial; probabilmente i due migliori che ho trovato sono:

Avrai bisogno di una discreta quantità di background di programmazione C ++ (e di un ambiente di build funzionante) per riuscirci.

Tuttavia, ciò presuppone che il servizio stia esaminando la directory corrente. Un'altra possibilità è che sta usando %path%. Dici che "inizia da system32, cerca qualche altra posizione, e infine la sua directory", quindi questo mi sembra più probabile.

Confronta le directory che vedi procmoncon le tue %path%. Se sono uguali, prendere in considerazione la modifica del SYSTEM %path%o %path%dell'utente che esegue il servizio, in modo che la directory in cui si desidera cercare sia la prima.

Credo che Fred abbia ragione, però: è improbabile che tu possa vedere alcun vantaggio significativo in termini di prestazioni facendo questo, a meno che non accada molto frequentemente. Le semplici operazioni di apertura dei file non sono particolarmente costose, soprattutto se si tratta di un percorso locale e il file non esiste.


La variabile d'ambiente PATH di sistema è stata la prima cosa che mi è venuta in mente. L'inserimento del percorso del servizio all'inizio della variabile PATH avrà comunque un effetto negativo sulle prestazioni di quasi tutte le altre applicazioni, quindi non lo consiglierei.
Marnix van Valen,

Non ho numeri concreti per sostenere questo in entrambi i modi, ma la mia intuizione mi dice che non si verificherebbe alcun guadagno o perdita di prestazioni pratiche dalla modifica del percorso. Questo è uno scenario abbastanza comune; nessuno incolpa, per esempio, gli strumenti di supporto di Windows o SQL Server, per avere un impatto negativo sulle prestazioni del sistema quando modifica il percorso durante l'installazione. Questa non è la prima volta che vedo qualcuno guardare procmon e andare "omg, guarda tutti quegli accessi ai file!", Non rendendosi conto che è tipico per la maggior parte delle applicazioni.
fissione

+1 per la creatività. :-) Capisco perfettamente che queste operazioni sui file non influiscono in modo misurabile sulle prestazioni, quindi non mi preoccuperò davvero di scrivere una soluzione di iniezione DLL. %PATH%Tuttavia, la modifica per l'account utente con cui viene eseguito il servizio è una buona idea.
Tomalak,

1
La creazione di un utente speciale per eseguire solo questo servizio e la modifica di% PATH% per questo utente sembra un'ottima soluzione. +1
Sunny,

@fissione: Sì, significa che accetto la tua risposta. ;) Non è quello che avevo sperato, ma è il più vicino possibile, immagino.
Tomalak

1

Come MattB, non conosco alcun modo per cambiare la directory di lavoro del servizio senza accesso al codice sorgente. Per questo specifico scenario, è probabile che i controlli di directory extra non impongano quell'attività del disco superflua rispetto alla quantità di I / O richiesta per l'operazione di indicizzazione del testo completo. Anche se potessi ottimizzarli via, l'indice full-text sarà intensivo su disco per la natura della bestia.


1

Aggiungi un valore di stringa "AppDirectory" alla chiave dei parametri e imposta il valore sulla directory di lavoro desiderata.


Hm. Appena testato, non sembra funzionare (su Windows 7, utilizzato il tipo di dati REG_EXPAND_SZ). Puoi riconfermare che questo funziona davvero per te, per favore?
Tomalak,

Funziona quando si usa srvany. Non sono sicuro dei servizi normali.
Konstantin Spirin

1

Farlo all'interno della funzione principale del Servizio:

  • Telefona a GetModuleFilename. Recupera il nome del modulo (exe) incluso il percorso, nel modulo C:\path\to\exe\your_service.exe.
  • Usa manipolazioni di stringhe (magari usando la std::stringfunzione find_last_of()), per trovare l'ultima barra rovesciata. Spoglia / taglia la stringa da lì in poi per ottenere il percorso del tuo modulo e quindi la directory del tuo exe.
  • Chiama la funzione SetCurrentDirectorye voilà!

1
non dimenticare di passare null al parametro HMODULE nella chiamata della funzione GetModuleFilename :)
uprightech
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.