Zaktualizowany skrypt. Zweryfikowano działanie i nie uruchamia okna dialogowego uprawnień.
Nie można uniemożliwić Windowsowi utworzenia pliku desktop.ini, ponieważ tak naprawdę to nie Windows to robi. Niektóre inne usługi zewnętrzne powodują utworzenie tego pliku i oczywiście Windows na to pozwala, mimo UseDesktopIniCache = 0.
Desktop.ini doprowadzał mnie do szaleństwa, więc wymyśliłem rozwiązanie typu ragtag. Zauważyłem, że plik desktop.ini zostaje utworzony kilka sekund po uruchomieniu. Skorzystałem z tego. Korzystając z Harmonogramu zadań, tymczasowo wyłączam uprawnienia do zapisu na pulpicie podczas uruchamiania. To powstrzymuje usługi innych firm przed wykonywaniem shenaniganów na moim pulpicie. Następnie minutę po uruchomieniu inne zadanie przywraca uprawnienia do zapisu na pulpicie.
Tutaj udostępniłem zestaw przykładowych plików XML dla Task Scheduler do wykonania zadania.
Ta wersja skryptu wyłącza dziedziczenie
Stwierdziłem, że dziedziczenie jest zbyt mylące, dlatego wyłączyłem go dla folderu Desktop. Możesz dodać / dziedziczenie: e gdzieś w drugim skrypcie, jeśli naprawdę tego potrzebujesz, ale pamiętaj, że wyłączenie dziedziczenia jest procesem stratnym, dlatego dodanie tej linii nie zmieni wszystkiego z powrotem tam, gdzie były wcześniej. Pulpit nie jest folderem systemowym, dlatego nie powinien mieć na ciebie wpływu.
Ten służy do wyłączania uprawnień do zapisu podczas rozruchu:
<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.4" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
<RegistrationInfo>
<Date>2018-01-09T18:21:14.9818893</Date>
<Author>spero_LAPTOP\spero</Author>
<URI>\Desktop Write Permission disable</URI>
</RegistrationInfo>
<Triggers>
<LogonTrigger>
<ExecutionTimeLimit>PT1M</ExecutionTimeLimit>
<Enabled>true</Enabled>
</LogonTrigger>
</Triggers>
<Principals>
<Principal id="Author">
<UserId>##################################</UserId>
<LogonType>Password</LogonType>
<RunLevel>HighestAvailable</RunLevel>
</Principal>
</Principals>
<Settings>
<MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
<DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
<StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
<AllowHardTerminate>true</AllowHardTerminate>
<StartWhenAvailable>false</StartWhenAvailable>
<RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
<IdleSettings>
<StopOnIdleEnd>true</StopOnIdleEnd>
<RestartOnIdle>false</RestartOnIdle>
</IdleSettings>
<AllowStartOnDemand>true</AllowStartOnDemand>
<Enabled>true</Enabled>
<Hidden>true</Hidden>
<RunOnlyIfIdle>false</RunOnlyIfIdle>
<DisallowStartOnRemoteAppSession>false</DisallowStartOnRemoteAppSession>
<UseUnifiedSchedulingEngine>true</UseUnifiedSchedulingEngine>
<WakeToRun>false</WakeToRun>
<ExecutionTimeLimit>PT1M</ExecutionTimeLimit>
<Priority>7</Priority>
</Settings>
<Actions Context="Author">
<Exec>
<Command>ICACLS</Command>
<Arguments>"C:\Users\spero\Desktop" /inheritance:d /remove "SYSTEM"</Arguments>
</Exec>
<Exec>
<Command>ICACLS</Command>
<Arguments>"C:\Users\spero\Desktop" /remove "Administrators"</Arguments>
</Exec>
<Exec>
<Command>ICACLS</Command>
<Arguments>"C:\Users\spero\Desktop" /remove "spero"</Arguments>
</Exec>
<Exec>
<Command>ICACLS</Command>
<Arguments>"C:\Users\spero\Desktop" /grant "Administrators":(OI)(GR)</Arguments>
</Exec>
<Exec>
<Command>ICACLS</Command>
<Arguments>"C:\Users\spero\Desktop" /grant "spero":(OI)(GR)</Arguments>
</Exec>
</Actions>
</Task>
Ten służy do przywrócenia uprawnienia minutę później:
<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.4" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
<RegistrationInfo>
<Date>2018-01-09T18:19:03.2968461</Date>
<Author>spero_LAPTOP\spero</Author>
<URI>\Desktop Write Permission</URI>
</RegistrationInfo>
<Triggers>
<LogonTrigger>
<ExecutionTimeLimit>PT1M</ExecutionTimeLimit>
<Enabled>true</Enabled>
<Delay>PT1M</Delay>
</LogonTrigger>
</Triggers>
<Principals>
<Principal id="Author">
<UserId>######################################</UserId>
<LogonType>Password</LogonType>
<RunLevel>HighestAvailable</RunLevel>
</Principal>
</Principals>
<Settings>
<MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
<DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
<StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
<AllowHardTerminate>true</AllowHardTerminate>
<StartWhenAvailable>false</StartWhenAvailable>
<RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
<IdleSettings>
<StopOnIdleEnd>true</StopOnIdleEnd>
<RestartOnIdle>false</RestartOnIdle>
</IdleSettings>
<AllowStartOnDemand>true</AllowStartOnDemand>
<Enabled>true</Enabled>
<Hidden>true</Hidden>
<RunOnlyIfIdle>false</RunOnlyIfIdle>
<DisallowStartOnRemoteAppSession>false</DisallowStartOnRemoteAppSession>
<UseUnifiedSchedulingEngine>true</UseUnifiedSchedulingEngine>
<WakeToRun>false</WakeToRun>
<ExecutionTimeLimit>PT1M</ExecutionTimeLimit>
<Priority>7</Priority>
</Settings>
<Actions Context="Author">
<Exec>
<Command>ICACLS</Command>
<Arguments>"C:\Users\spero\Desktop" /grant "Administrators":F</Arguments>
</Exec>
<Exec>
<Command>ICACLS</Command>
<Arguments>"C:\Users\spero\Desktop" /grant "spero":F</Arguments>
</Exec>
</Actions>
</Task>
Pamiętaj, że mój napęd rozruchowy to dysk SSD, choć niezbyt szybki. Czasy mogą się różnić w zależności od szybkości uruchamiania systemu operacyjnego.
Nie można również importować tych skryptów bezpośrednio ze względu na obecność pól Autor i Identyfikator użytkownika. Po prostu zanotuj wszystkie parametry.
UseDesktopIniCache=0
(z odpowiedzi na stronie superuser.com/a/650431/523828 ) nie działa w systemie Windows 10?