10 Replies Latest reply on Feb 3, 2017 7:32 AM by RikerW

    Der Speicherplatz im Cache reicht nicht aus

    SitzRieSe Expert
      Hi Zusammen,

      altes Thema aber ich wollte nochmal fragen bevor wir hier was Wildes basteln. Ich würde gerne eine Benachrichtigung konfigurieren sobald der Speicherplatz erreicht ist da wir das Thema leider immer wieder mal haben und es nicht merken wenn das Problem auftritt.

      Da DSM ja keine Pakete in diesem Zustand staged, mal meine Frage, hat Jemand von euch das gelöst und wenn ja wie?

      Ich neige aktuell an ein SQL Query, das müsste ich aber dann entsprechend regelmäßig ausführen, mir wäre es lieber wenn die Nachricht einmal ausgelöst wird wenn das Problem auftritt.

      Vielleicht habt ihr ja ein paar Ideen

      Gruß

      Alex
        • 1. Re: Der Speicherplatz im Cache reicht nicht aus
          NicoS1 Master
          Hallo Alex,

          Bei uns gibts nen "Nag-Screen".

          $c = Get-WmiObject win32_logicaldisk | where {$_.DeviceID -eq "C:"}
          $percent = [math]::Round(($c.freespace / $c.Size * 100), 2)
          if($percent -lt 6) {
          $message = "Der freie Festplattenplatz auf Ihrem Laufwerk C: beträgt nur noch $percent%.
          Bitte bereinigen Sie Ihre Daten, da sonst eine ordnungsgemäße Funktion Ihres Systems nicht sichergestellt werden kann
          und ggf. Installationen aus dem Software Shop nicht mehr möglich sind!
          Es sollten mindestens 5% freier Festplattenplatz zur Verfügung stehen.
          Sollten Sie hierbei Unterstützung benötigen, wenden Sie sich bitte an ...
          ---
          There is only $percent% free disk space left on your C: drive.
          Please clean up your data, otherwise proper functionality of your system cannot be assured and installations from the
          Software Shop might not be possible anymore.
          You should keep at least 5% of free disk space.
          If you need any help cleaning up data, please contact ..."
          Add-Type –AssemblyName System.Windows.Forms
          [System.Windows.Forms.MessageBox]::Show($message,"Disk Space Warning",0)
          }


          Das als PowerShell Script auf den Client kopiert via GPO, und beim User als Scheduled Task laufen lassen beim Anmelden.
          • 2. Re: Der Speicherplatz im Cache reicht nicht aus
            SitzRieSe Expert
            Hi Nico,

            an sowas hab ich auch schon gedacht, würde es dann aber eher per DSM lösen. Wir haben den Schwellwert für das Staging schon extrem runter geschraubt, habt ihr denn noch irgendwie eine Benachrichtigung für die Administratoren?

            Bei uns gibs leider genug Spezis die die Meldung einfach ignorieren...
            • 3. Re: Der Speicherplatz im Cache reicht nicht aus
              derniwi Master
              Hallo Alex,

              ich habe hier ein kleines Skript als Job laufen, welches den freien Speicher auf C: prüft:
              Set('SMTPFROM','Hostmaster')
              Set('SMTPFROMMAIL','hostmaster@ourcompany.com')
              Set('SMTPTOMAIL','helpdesk@ourcompany.com')
              Set('FreeSpace','4194304')
              !
              If DiskFree('C:')<%FreeSpace%
              Set('_WMI_DeviceID','')
              Set('_WMI_FreeSpace','')
              WMISimpleQuery('\\.\root\cimv2','WIN32_LOGICALDISK','DeviceID=C:','_WMI_')
                FreeSpace
              EndProc/TS
              !
              Set('varA','%_WMI_FreeSpace%')
              Set('varB','1048576')
              Set('varOperator','\')
              CallScript('.\Extern$\VBCalculator.vbs','')/TS
              If %varMsg%=''
                SendSmtpMail('%SMTPFROMMAIL%|%SMTPFROM%','%SMTPTOMAIL%||','zu wenig freier Speicher auf %COMPUTERNAME%: %varResult% MB','%Reporting.SmtpServer%','')
                 Auf dem Rechner %COMPUTERNAME% sind auf Laufwerk C: noch %varResult% MB Speicherplatz frei.
                EndProc
                ExitProcEx(Done,'freier Speicher: %varResult% MB')
              Else
                SendSmtpMail('%SMTPFROMMAIL%|%SMTPFROM%','%SMTPTOMAIL%||','zu wenig freier Speicher auf %COMPUTERNAME%  %_WMI_FreeSpace% Bytes','%Reporting.SmtpServer%','')
                 Auf dem Rechner %COMPUTERNAME% sind auf Laufwerk C: noch %_WMI_FreeSpace% Byte Speicherplatz frei.
                
                 Fehler bei der Umwandlung:
                 %varMsg%
                EndProc
                ExitProcEx(Done,'freier Speicher: %_WMI_FreeSpace% Bytes')


              Dazu gibt es noch das ".\Extern$\VBCalculator.vbs"-Skript:
              ' VBCalculator
              ' A simple calculator using registry values
              Option Explicit
              Dim varA
              Dim varB
              Dim varOperator
              Dim varResult
              Dim varMsg
              Dim bOK

              ' Read and check the variable which have to be set in the eScript
              ' varName: name of the registry variable
              ' Returns "ERR" in case of any error or the value as double data type
              Function getVar( ByVal varName )
              getVar = "ERR"
              On Error Resume Next
              getVar = NIGetVar( varName )
              If ( 0 = err.number ) Then
                If ( "" = getVar ) Then
                 bOK = False
                 varMsg = varMsg & " " & varName & " empty"
                Else
                 getVar = CDbl( getVar )
                 If ( 0 <> err.number ) Then
                  bOK = False
                  varMsg = varMsg & " Error converting " & getVar
                 End If 
                End If
              Else
                bOK = False
                varMsg = varMsg & " " & varName & " not Found"
              End If

              On Error Goto 0
              End Function

              ' Read and check the operator which have to be set in the eScript
              ' Returns "ERR" in case of any error or the operator as one of "+", "-", "*", "/" and "^"
              Function getOperator( ByVal varName )
              getOperator = "ERR"
              On Error Resume Next
              getOperator = NIGetVar( varName )
              If ( 0 = err.number ) Then
                If ( "" = getOperator ) Then
                 bOK = False
                 varMsg = varMsg & " " & varName & " empty"
                Else
                 If (( "+" <> getOperator ) AND _
                  ( "-" <> getOperator ) AND _
                  ( "*" <> getOperator ) AND _
                  ( "/" <> getOperator ) AND _
                  ( "\" <> getOperator ) AND _
                  ( "^" <> getOperator ) AND _
                  ( "ABS" <> getOperator ) AND _
                  ( "HEX" <> getOperator ) AND _
                  ( "RND" <> getOperator )) Then
                  bOK = False
                  varMsg = varMsg & " Unknown operator: " & getOperator
                 End If 
                End If
              Else
                bOK = False
                varMsg = varMsg & " " & varName & " not Found"
              End If

              On Error Goto 0
              End Function

              ' Initialize variables
              bOK = True
              varMsg = ""
              varResult = "ERR"

              ' Get variables
              varA = getVar( "varA" )
              varB = getVar( "varB" )

              ' Get operator
              varOperator = getOperator( "varOperator" )

              ' If everything is ok calculate
              If bOK Then
              On Error Resume Next
              Select Case varOperator
                Case "+" ' Addition
                 varResult = varA + varB
                Case "-" ' Subtraction
                 varResult = varA - varB
                Case "*" ' Multiplication
                 varResult = varA * varB
                Case "/" ' Division
                 varResult = varA / varB
                Case "\" ' Integer division
                 varResult = CLng( varA / varB )
                Case "^" ' Exponentiation
                 varResult = varA ^ varB
                Case "ABS" ' Absolute value
                 varResult = Abs( varA )
                Case "HEX" ' Convert varA to hex
                 varResult = Hex( varA )
                Case "RND" ' Random
                 varResult = Rnd( varA )
                Case Else
                 varMsg = varMsg & " Unknown operator: " & varOperator
              End Select

              ' Calculation error handling
              If ( 0 <> err.number ) Then
                varResult = "ERR"
                varMsg = varMsg & " Error " & Err.Description
              End If
              On Error Goto 0
              End If

              ' Write result and message to eScript variables
              NISetVar "varResult", Trim( CStr( varResult ))
              NISetVar "varMsg", Trim( varMsg )


              Das eScript läuft bei jedem Login im Kontext des Service.

              Gruß
              Nils
              • 4. Re: Der Speicherplatz im Cache reicht nicht aus
                NicoS1 Master
                Hi Alex,

                ich hab es extra NICHT im DSM gelöst, da bei vollem Cache ja unter Umständen auch der Job nicht mehr ausgeführt wird ;-) Im Moment haben wir nur diesen NagScreen.

                Also Info für Admins... ich bin mir (fast) sicher, dass es über Centennial möglich sein sollte, wenn man das im Einsatz hat. Da müsste man dann gar nichts extra auf den Clients laufen lassen.

                Gruß
                • 5. Re: Der Speicherplatz im Cache reicht nicht aus
                  SitzRieSe Expert
                  Ja genau deswegen bin ich auch noch im Zwiespalt.

                  Ich hab jetzt auch mal ein Feature Request geöffnet, weil in der Infrastruktur gibt es ja die Option "Warnung, wenn weniger als [GB] Plattenplatz frei ist". Die Option loggt es laut Hilfe aber nur in das lokale Logfiles des Clients... WOW Völlig nutzlos.

                  Daher hab ich jetzt mal ein FR aufgemacht. Temporär werde ich es mal mit einem DSM Skript versuchen und beobachten. Ggf kommt noch sowas wie dein ps1 dazu.

                  Danke erstmal für den Gedankenaustausch
                  • 6. Re: Der Speicherplatz im Cache reicht nicht aus
                    SitzRieSe Expert
                    Ich hab jetzt Folgendes gebastelt... Vielleicht hilft es ja nochmal Jemand

                    Set('CleanupExecuted','0')
                    !
                    RegReadValueEx('HKEY_LOCAL_MACHINE\SOFTWARE\...\ClientInformations','DiskCleanupExecuted','CleanupExecuted',reUseX64Hive)
                    !
                    : LOOP1
                    !Update diskspace information
                    WMIGetIndexData('\\.\root\cimv2','WIN32_LOGICALDISK','0','WMI_')
                    FreeSpace
                    EndProc
                    WMIGetIndexData('\\.\root\cimv2','WIN32_LOGICALDISK','0','WMI_')
                    Size
                    EndProc
                    ModifyObjectProperty(f_CurrentComputer,'CustomClientInformations','FreeSpace','%WMI_FreeSpace%')
                    ModifyObjectProperty(f_CurrentComputer,'CustomClientInformations','DiskSize','%WMI_Size%')
                    !
                    If DiskFree('%systemdrive%')<8388608
                    If %CleanupExecuted%='1'
                      MsgBoxEx('ACHTUNG! der freie Speicherplatz auf Laufwerk %systemdrive% beträgt weniger als 8GB. Die Datenträgerbereinigung wurde bereits ausgeführt!Bitte bereinigen Sie Ihre persönlichen Daten!','return','',mbOK,'30','0')
                      SendSmtpMail('DSM@....de|DSM ... Systeme','%InstallationParameters.EMail%||','Nicht genug freien Speicherplatz auf %computername%','%InstallationParameters.MailServer%','')
                       Auf Computer %computername% sind weniger als 8GB freien Speicherplatz verfügbar.
                      
                       Die Datenträgerbereinigung wurde bereits ausgeführt. Der User wurde bereits zum bereinigen der persönlichen Daten aufgefordert.
                      
                       Tritt diese Meldung wiederholt auf, muss der User erneut zur Bereinigung aufgefordert werden!
                      EndProc
                    Else
                      MsgBoxEx('ACHTUNG! der freie Speicherplatz auf Laufwerk %systemdrive% beträgt weniger als 8GB. Die Datenträgerbereinigung wird nun ausgeführt.','return','',mbOK,'30','0')
                    !  cleanup system directories
                      RunAsEx('.\Extern$\DiskCleanup.bat','','','','20','exitcode',raUseSisAccount+WaitForExecution+UndoneContinueParentScript)/TW
                    !  run cleanmgr
                      RegLoadEx('.\Extern$\cleanmgr_config.reg',reUseX64Hive)
                      ExecuteEx('cleanmgr /sagerun:20','exitcode','')/?/x64/TS
                      If not %exitcode%='0'
                       If not %exitcode%='3010'
                        ExitProcEx(Failed,'Disk Cleanup failed with %exitcode%')
                    !   
                      RegModify('HKEY_LOCAL_MACHINE\SOFTWARE\...\ClientInformations','DiskCleanupExecuted','1',reUseX64Hive+mrReplace)/TS
                      goto LOOP1
                    Else
                    RegModify('HKEY_LOCAL_MACHINE\SOFTWARE\...\ClientInformations','DiskCleanupExecuted','0',reUseX64Hive+mrReplace)/TS
                    ExitProcEx(Done,'It is %WMI_Freespace% bytes available. No Disk Cleanup needed.')



                    In der Bat:

                    set LogPath="%ProgramFiles%\Common Files\enteo\NiLogs"
                    if %PROCESSOR_ARCHITECTURE%==AMD64 set LogPath="%ProgramFiles(x86)%\Common Files\enteo\NiLogs"
                    set LogFile=cleanup_%date%.log
                    set RegFile=CleanupConfig.reg

                    echo ### Starting System Cleanup at %date% %time% ### >%LogPath%\%LogFile% 2>&1

                    echo --- Start Deleting %windir%\Prefetch\* >>%LogPath%\%LogFile% 2>&1
                    del /S /F /Q %windir%\Prefetch\* >>%LogPath%\%LogFile% 2>&1
                    for /D %%a in ("%windir%\Prefetch\*") do rd /q /s "%%a" >>%LogPath%\%LogFile% 2>&1
                    echo . >>%LogPath%\%LogFile% 2>&1

                    echo --- Start Deleting %windir%\SysWow64\CCM\Cache\* >>%LogPath%\%LogFile% 2>&1
                    del /S /F /Q %windir%\SysWow64\CCM\Cache\* >>%LogPath%\%LogFile% 2>&1
                    for /D %%a in ("%windir%\SysWow64\CCM\Cache\*") do rd /q /s "%%a" >>%LogPath%\%LogFile% 2>&1
                    echo . >>%LogPath%\%LogFile% 2>&1

                    for /F %%a in ('dir /b /a:d C:\Users') do echo --- Start Deleting %%a\Appdata\Local\Temp\* >>%LogPath%\%LogFile% 2>&1
                    for /F %%a in ('dir /b /a:d C:\Users') do del /S /F /Q C:\Users\%%a\AppData\Local\Temp\*  >>%LogPath%\%LogFile% 2>&1
                    for /F %%a in ('dir /b /a:d C:\Users') do (
                    for /D %%n in ("C:\Users\%%a\AppData\Local\Temp\*") do rd /q /s "%%n" >>%LogPath%\%LogFile% 2>&1
                    )
                    echo . >>%LogPath%\%LogFile% 2>&1

                    echo --- Start Deleting %systemdrive%\Temp\* >>%LogPath%\%LogFile% 2>&1
                    del /S /F /Q %systemdrive%\Temp\* >>%LogPath%\%LogFile% 2>&1
                    for /D %%a in ("%systemdrive%\Temp\*") do rd /q /s "%%a" >>%LogPath%\%LogFile% 2>&1
                    echo . >>%LogPath%\%LogFile% 2>&1

                    echo --- Start Deleting %windir%\Temp\* >>%LogPath%\%LogFile% 2>&1
                    del /S /F /Q %windir%\Temp\* >>%LogPath%\%LogFile% 2>&1
                    for /D %%a in ("%windir%\Temp\*") do rd /q /s "%%a" >>%LogPath%\%LogFile% 2>&1
                    echo . >>%LogPath%\%LogFile% 2>&1

                    echo ### System Cleanup at %date% %time% complete ### >>%LogPath%\%LogFile% 2>&1



                    Gruß

                    Alex
                    • 7. Re: Der Speicherplatz im Cache reicht nicht aus
                      derniwi Master
                      Hallo Alex,

                      ja, ich hatte vor einiger Zeit auch schon nachgefragt.
                      Das Problem bei "meiner" Version ist, dass die Rechner Emails versenden müssen. Was aber nicht immer gewünscht ist, daher musste ich im System schon etwas tricksen, damit der Mail-Server nicht als SPAM-Schleuder missbraucht werden kann. Schön wäre es, wenn der Server den geringen Speicher erkennen könnte und danach eine Mail versenden würde.

                      Auch bei anderen Problemen beim Client ist es aktuell nur möglich, entweder vom Client eine Nachricht zu schicken oder zu protokollieren. Wenn hier DSM etwas mehr machen würde und man per eScript eine Mail über den Server absenden könnte, wäre das auch besser.

                      Zu Deinem Skript:
                      Ich finde das Aufräumen immer etwas bedenklich, zumal es Programme gibt, die im tempoäraren Ordner Daten ablegen und zwischenspeichern. Wenn diese dann hart gelöscht werden, kann das durchaus Datenverlsut nach sich ziehen. Daher nehme ich solche Aufräumarbeiten nur vor, wenn keine Programme laufen.

                      Auch der Einsatz solcher automatischen Aufräum-Tools kann hier Probleme verursachen... ich sage nur "Lotus Notes" und das temp-Verzeichnis... wird das von Notes verwendete Verzeichnis gelöcht, während Notes läuft, kann man keine Anhänge mehr öffnen... erst nach einem Notes-Neustart geht das wieder... da habe ich auch mal längere Zeit gesucht, warum ein Benutzer mit den Anhängen Probleme hat... bis ich ein solches Tool (nicht installiert, nur als .exe) auf dem Rechner gefunden habe...

                      Gruß
                      Nils
                      • 8. Re: Der Speicherplatz im Cache reicht nicht aus
                        SitzRieSe Expert
                        Hi Nils,

                        ich habe jetzt dafür gesorgt das das Skript nur bei der Benutzeranmeldung läuft, daher hoffe ich mal das das Cleanup problemlos läuft. Ich werde das aber auch noch ausreichend testen bevor es Live geht. 3rd Party Cleanup Tools fass ich persönlich auch garnicht an, der cleanmgr ist ja die Datenträgerbereinigung von Windows und damit habe ich bisher noch keine negativen Erfahrungen gemacht.

                        Zu dem Thema Mailversand... Ja finde ich auch bescheiden, aber in unserem Fall wird das so funktionieren. Ein Kollege hat mit php und curl mal ein Skript gebaut, wo man am Client mit curl.exe ein http Aufruf ausführt und der Webserver dann eine Email an den Mail Server auslöst. Das kann man aktuell ganz gut als Workaround benutzen.

                        Gruß

                        Alex
                        • 9. Re: Der Speicherplatz im Cache reicht nicht aus
                          derniwi Master
                          Der Microsoft cleanmgr... naja, macht schon einiges...
                          Ich hatte den mal bei der Erstellung eines neuen install.wim-Files getestet, also Windows installiert, Updates drauf, ein paar andere Anpassungen und dann edn Cleanmgr und Sysprep. Lieder bleiben da im temp-Ordner doch noch einige Sachen zurück, an anderen Stellen könnte er durchaus auch mehr machen. Nicht, dass die Dateien in Benutzung waren, ich hatte im Skript dann eine Pause und einen offenen Explorer, da konnte ich problemlos den Rest löschen...
                          Aber ich denke, darauf kommt es ja nicht wirklich an.

                          Problematisch wird es halt, wenn der Benutzer den Rechner (mehr oder weniger unbewußt) C: füllt, z.B. viele Dateien als Sicherung auf dem Desktop - oder als Arbeitskopien für unterwegs... so ein paar Kandidaten kenne ich da auch.

                          Da muss man halt doch händisch ran...
                          • 10. Re: Der Speicherplatz im Cache reicht nicht aus
                            RikerW Rookie
                            Ich mache es per SQL Abfrage.


                            SELECT DISTINCT [CMDB].[dbo].[CMPG_BASICINVENTORY].[FullQualifiedName]

                                  ,[CMDB].[dbo].[CMPG_BASICINVENTORY].[LastSyncDate]
                                  ,[CMDB].[dbo].[CMSY_POLICYINSTANCE].[LASTCOMMENT]
                            FROM [CMDB].[dbo].[CMSY_POLICYINSTANCE]
                            INNER JOIN [CMDB].[dbo].[CMPG_BASICINVENTORY] ON (TARGETOBJECTID = OBJECTID)
                            WHERE [LASTCOMMENT] Like '%Der Speicherplatz im Cache reicht nicht aus%'
                            or [LASTCOMMENT] like '%The cache space does not suffice.%'