Freitag, 21. Juni 2019

Bunt und eckig

Es gibt zwar zahlreiche Tools, das Windows 10 - Startmenü so aussehen zu lassen, wie das, was man seit 1995 kennt - ich halte aber wenig von dieser 25 Jahre alten Benutzerführung. Ich mag die Kacheln. Warum aber manche Kacheln bunt sind (z.B. Firefox, Office), und andere wieder nicht, stört mich. Eigentlich stört es mich, dass ich es nicht beeinflussen kann.

Kann ich aber:

Mit Windows Tile Color Changer kann ich den Hintergrund jeder Kachel färben:

Nehmen wir das Beispiel Skype:



So gehts:

WTCC unter https://www.thewindowsclub.com/windows-tile-color-changer-download herunterladen, Programm öffnen, Application im Drop Down auswählen, Farbe auswählen oder Hex-Code eintragen und auf "Change Color" klicken.


Nun ist die gewählte Kachel farbig:



Wem die in dieser App angezeigten Farben nicht reichen, kann den Color-Hex auch gern über https://html-color-codes.info ermitteln und dann manuell eintragen.

Freitag, 26. April 2019

Windows-Shortcuts


Ich arbeite seit fast 30 Jahren mit Windows und dennoch gibt es immer wieder etwas Neues, was ich über das Betriebssystem lernen kann - z.B. aus diesem Artikel:


Was ich noch nicht kannte:

Windows-Logo + Links (Rechts, Oben, Unten)
Verkleinert, vergrößert Fenster oder ordnet sie an

Windows-Logo + D
Verkleinert sofort alles

Windows-Logo + V
Bei aktivierter Option ist das ein Zwischenablage-Verlauf

Windows-Logo + STRG + D
Erzeugt einen neuen leeren virtuellen Desktop

Windows-Logo + Punkt
öffnet ein Emoji-Fenster 😃

Den Rest nutze ich bereits.

Freitag, 12. April 2019

Wann läuft mein Passwort ab?

Unsere IT besteht darauf, dass wir regelmäßig unser Kennwort ändern. Wie ich dazu stehe, habe ich ja in diesem Post Wider den Zwang zur Passwort-Änderung hinreichend beschrieben. Aber es ist halt so - da kann ich zetern, wie ich möchte - ich kann es nur für mich managen.

Nun ist es für mich sehr viel besser, wenn ich mich nicht unterwegs davon überraschen lasse, dass mein Kennwort abgelaufen ist; E-Mails funktionieren nicht mehr, Termine und Aufgaben werden nicht mehr verlässlich synchronisiert und es wird zu einem mittlerem Chaos führen, wenn ich mich im Büro wieder in die Domäne anmelden möchte.

Also wäre es super, wenn ich wüsste, wann mein Kennwort ausläuft. Und das geht mit folgendem Befehl in der Eingabeaufforderung:

net user Benutzername /domain


·

Schon wieder Eingabeaufforderung? Hat Microsoft nicht so 'ne wunderschöne PowerShell?

Ja, wenn ihr das mit der Powershell realisieren wollt, gib es hier einen Ansatz:
Ablaufdatum von AD-Passwörtern in PowerShell auslesen.

Für mich ist "net use" perfekt - deshalb lasse ich auch hier die PowerShell links liegen.

Freitag, 29. März 2019

Ping mit Beep via Batch


Batch ist tot? Bei mir nicht. Ich mache viel damit:

  • Laufwerke in Abhängigkeit des Standortes verbinden
  • Funktionen je nach Verfügbarkeit bereitstellen

oder eben

  • warnen, wenn die VPN ausfällt


Bei uns ist das so, dass die Standorte via VPN gegenseitig verfügbar sein sollen und uns die Jungs von der "IT" einen Router hingestellt haben, der das zwar tut, aber alle Nase lang neu gestartet werden muss. Mich nervt das, weil mich der Internetausfall durch den Routerneustart regelmäßig unvorbereitet trifft.

Wie schön wäre es doch, wenn ich mich selbst wenigstens vorwarnen könne?

Kann ich - mach ich - mit Batch.

Beep mit Batch

Schwierigkeit 1 ist, dass es eine BEEP.EXE o.ä. nicht mehr gibt. Die könnte man zwar aus WinXP extrahieren, aber wer will das schon. Also mit Boardmitteln:

Leider muss man hier ein wenig tricksen, weil wir ein nichtdruckbares Zeichen benutzen wollen, welches wir nicht so ohne weiteres eingeben können. Aber so geht's:

cmd öffnen, dann nacheinander folgende Befehle eingeben und jeweils mit der ENTER-Taste abschließen:


1
2
3
copy con beep.bat
echo ^G
^Z

(Das ^G erhaltet ihr, indem ihr die Tasten [Strg + G] drückt.)

Jetzt haben wir schon mal eine BEEP.BAT, die Windows dazu veranlasst, dass ein Standardton ausgegeben wird.

Schön und funktional

Der Eintrag in der BEEP.BAT sieht richtigerweise so aus:



Den Eintrag kopieren wir in eine funktionale BATCH:


:Start
@echo off
rem Ping-Test mit Warnton auf Verfuegbarkeit der VPN 

set ipziel=192.168.168.168
set Minute=%time:~4,1%

cls
echo.
echo.
echo.
echo.
echo.
echo.
echo ---------------------------------------
echo.
echo       Es ist:
echo.
echo                %time:~0,8%
echo.
echo ---------------------------------------
ping -n 1 localhost > NUL

:Ping
ping %ipziel% -n 2 -w 1000 -l 128|findstr "berschreitung"
if %errorlevel%==0 goto Fehler
if %Minute% == 0 goto Bild
goto Start

:Fehler
echo. 
echo. 
echo !!!! Achtung: die VPN ist offline !!!!
echo  
timeout 2 >> NUL
echo Die IP: %ipziel% ist nicht erreichbar!
echo  
timeout 2 >> NUL
echo  
timeout 20 >> NUL
goto Start

:Bild
for /L %%A IN (1,1,14) DO call PingPong_PIC.bat
cls
goto Start

:Ende

Zur Erläuterung:

set ipziel=192.168.200.158
hier wird eine Variable mit der Ziel-IP deklariert

set Minute=%time:~4,1%
hier wird eine Variable deklariert, die die 5. Stelle (es beginnt mit "0") der Uhrzeit auswirft. Das benutzen wir später, um die Anzeige etwas aufzulockern

echo   %time:~0,8%
wirft die aktuelle Uhrzeit aus, aber nur von der 0. Stelle und davon 8 Zeichen

ping -n 1 localhost > NUL
ist nur davor da, dass die Anzeige einen Augenblick sichtbar ist

ping %ipziel% -n 2 -w 1000 -l 128|findstr "berschreitung"
das ist der eigentliche PING-Befehl: zwei Pakete mit 1 KB, einer Antwortdauer von 128 ms
hinter dem Pipe wird der Output auf die Zeichenfolge "berschreitung" geprüft. Das nutzen wir, um einen Errorlevel zu bekommen (0 = erfolgreich), und dadurch den Fehler des Pings  von dessen Erfolg unterscheiden zu können.

if %errorlevel%==0 goto Fehler
wenn also in der Rückgabe des Pings die Zeichenkette "berschreitung" gefunden wird, ist der Errorlevel erfolgreich und das Programm springt zur Sprungmarke ":Fehler"

if %Minute% == 0 goto Bild
wenn Errorlevel nicht 0 (also 1) ist, dann ist alles in Ordnung. Hier prüfen wir ab, ob die Minute eine Zehner-Minute ist (10 oder 20 oder 30 oder ...). Wenn ja, dann springe zur Sprungmarke ":Bild".

echo BEL
timeout 2 >> NUL
in der Sektion ":Fehler" wird nun das o.a. BEEP ausgegeben. Damit es auch hörbar ist, ergänzen wir es um einen timeout-Befehl.

Übrigens nutze ich für die Anzeige von Quellcode http://hilite.me/. Leider kann hilite.me mit nichtdruckbaren Zeichen nicht umgehen und zeigt nur ein " " an...

for /L %%A IN (1,1,14) DO call PingPong_PIC.bat
in der Sektion ":Bild" rufen wir eine PINGPONG_PIC.BAT auf, die wiederum nichts anderes tut, als ein ASCII-Art anzuzeigen. Bei mit sind das eine Abfolge von Bildern, die insgesamt eine ASCII-Animation ergeben. Das beschäftigt den Prozessor witzigerweise enorm, sodass ich ihm diesen Auslauf nur aller 10 Minuten gönne (siehe die Bedingung mit der Variable %Minute%).

goto Start
Tja und die verteilten Sprungmarken zurück verhelfen uns, dass wir immer wieder von vorn beginnen können.

Freitag, 15. März 2019

SCRCPY - Android fernsteuern

Bezugnehmend auf diesen Post: SideSync...mal wieder eines etwas mehr gelungen möchte ich meinen derzeit technisch irrgeleiteten Mitautor folgendes Tool für den Fall des Wiedereintritts auf die gute Seite der Macht in Aussicht stellen:

SCRCPY

Das Programm benutzt adb und benötigt deshalb ein per Kabel angeschlossenes Smartphone und aktiviertes USB-Debugging. Um USB-Debugging zu aktivieren müsst ihr erst die Entwickleroptionen durch fünfmaliges Tippen auf die Buildnummer aktivieren:



Dann könnt ihr dort USB-Debugging aktivieren:



Dann könnt ihr das Phone am PC benutzen:


SCRCPY könnt ihr bei GitHub herunterladen, entpacken, dann Phone anstöpseln und die scrcpy.exe starten.

Das ganze geht auch drahtlos. Mehr dazu in der README.

Freitag, 1. März 2019

SQL-Server entrümpeln



Unser Testsystem ist vollgelaufen, weil jeder da was ablegt, sich aber dann nicht mehr darum kümmert, ob das auch weg kann.

Nun gibt es zwei Szenarien, nachdem man suchen könnte:

Szenario 1: Löschen, was weg muss

Alles was nach einem Ablaufdatum noch da ist, muss weg. Das heißt, ich brauche  das Datum, wann die Datenbank erstellt wurde (hier: crDate) und wann der letzte Zugriff darauf erfolgte (hier chDate).


select d.Name, dbID, crDate, chDate =
(select lastdate = max(bb.xx) 
from (
    select xx = max(last_user_seek) 
        where max(last_user_seek) is not null 
    union all 
    select xx = max(last_user_scan) 
        where max(last_user_scan) is not null 
    union all 
    select xx = max(last_user_lookup) 
        where max(last_user_lookup) is not null 
    union all 
        select xx = max(last_user_update) 
        where max(last_user_update) is not null) bb)
, filename as Pfad
FROM master.dbo.sysdatabases d 
left outer join 
sys.dm_db_index_usage_stats s 
on d.dbid= s.database_id 
group by d.name, dbid, crdate, filename

Aber Achtung; das Datum wird bei Neustart des Rechners auf NULL gesetzt.



Szenario 2: Löschen, was sich lohnt

Wenn es sowieso ein Test-System ist, kann ja theoretisch alles weg. Man könnte aber auch vor allem denen auf die Füße treten, deren Datenbanken den meisten Platz beanspruchen. Hier muss man über eine Zwischentabelle arbeiten, weil die Size-Werte nicht nach MASTER übergeben werden:


use master;

set TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
GO

declare @Result Table (
 Database_Name sysname NOT NULL,
 Database_Owner sysname NULL,
 type_desc VARCHAR(10) NOT NULL,
 size_MB DECIMAL(18, 2) NOT NULL DEFAULT (0),
 used_MB DECIMAL(18, 2) NOT NULL DEFAULT (0),
 growth_MB DECIMAL(18, 2) NOT NULL DEFAULT (0),
 is_percent_growth TINYINT NOT NULL DEFAULT (0),
    PRIMARY KEY CLUSTERED (
        Database_Name,
        logical_name      ),
    UNIQUE (physical_name),
 Logical_Name sysname NOT NULL,
 physical_name VARCHAR(255) NOT NULL,
 compatibility_level VARCHAR(10) NOT NULL,
 collation_Name sysname NOT NULL,
 snapshot_isolation VARCHAR(5) NOT NULL DEFAULT ('OFF'),
 read_committed_SI TINYINT NOT NULL DEFAULT (0)
);
 
INSERT INTO @Result
EXEC    sys.sp_MSforeachdb @command1 = N'USE [?];
select
  DB_NAME(D.database_id) as [Database Name],
        SP.name as [Database_Owner],
        MF.type_desc,
        MF.size / 128.0  AS [size_MB],
        FILEPROPERTY(MF.name, ''spaceused'') / 128.0      AS [used_MB],
        CASE WHEN MF.[is_percent_growth] = 1
            THEN MF.[size] * (MF.[growth] / 100.0)
            ELSE MF.[growth]
        END    / 128.0  AS [growth_MB],
        MF.[is_percent_growth],
        MF.name,
        MF.physical_name,
        D.compatibility_level,
        D.collation_name,
        D.snapshot_isolation_state_desc,
        D.is_read_committed_snapshot_on
from    sys.databases AS D INNER JOIN sys.master_files AS MF
        ON    (D.database_id = MF.database_id) LEFT JOIN sys.server_principals AS SP
        ON    (D.owner_sid = SP.sid)
where    D.database_id = DB_ID();';
 
select * from @Result AS R order by type_desc desc, size_MB desc;
 

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
GO

Hier müssen die LOGs und die Datenbanken separat betrachtet werden.



Bunt und eckig

Es gibt zwar zahlreiche Tools, das Windows 10 - Startmenü so aussehen zu lassen, wie das, was man seit 1995 kennt - ich halte aber wenig von...