Bin da voll bei Dir Moombas, aber manchmal muss man sich nach der Decke strecke. So manche Vorgaben von Andere provozieren bei mir auch immer nur ein Kopfschütteln....
Beiträge von Racer
-
-
Wenn sicher gestellt ist das in dem Zielordner keine anderen Verzeichnisse vorhanden sind, kann man mit _FileListToArray ($sBasisPfad, "*." ,2 ) die Anzahl der Ordner ermitteln und dadurch die nächste freie fortlaufende Nummer ermitteln.
Bei ein paar hundert Verzeichnissen wird das egal sein, überhaupt wenn sie lokal liegen, aber wenn das mal auf einen Fileshare liegt von dem ich durch einen VPN-Tunnel auf die Firmendaten zugreiffe und dort liegen einige 10000 Ordner könnte das einen gewissen Geschwindigkeitsvorteil bringen...
lg
Racer -
genau das ist der punkt den ich gemeint habe bei den smarttvs heutzutage darfst du nichts mehr privat aufnehmen, du kannst es versuchen aber begibst dich automatisch in einen grau Bereich.
Da muss ich Dir widersprechen. Mein "alter" Fernsehr (LG, ~ 5 Jahre alt) kann auf einen USB-Stick (HD geht auch) das Fernseheprogramm aufnehmen (nicht aus den Apps vie Netflix und Co).
Das funktioniert auch zeitgesteuert, selbst wenn das Gerät auf Standby ist.
Auch mein neues Gerät (Grundig, mit AndroidTV, ~1 Jahr alt) kann das.
Was aus technischen Gründen nicht geht, ist eine Sendung aufnehmen und eine andere ansehen - dazu sind 2 Tuner notwendig und das haben meine Geräte nicht.
Was aber bewusst sein muss: Beide Fernseher verschlüsseln die aufgezeichteten Daten, so das sie nur dort abgeschspielt werden können.lg
Racer -
Naja... basierend auf diesem Artikel von gestern würde ich sagen: Lass den SmartTV garnicht ans Internet und nutze nur HDMI zuspieler...
https://www.heise.de/news/Moderne-D…er-9994787.html
Echt ne Frechheit, was mittlerweile alles gemacht/überwacht/ausspioniert wird (oft für Werbung),...
Sehr schöner Artikel....da hat man gleich die FQDN die man in die Kindersicherung eingeben kann
Oder in meinen Fall verwende ich ein WhiteList, damit der Fernseher nur dort hin kann wo ich es erlaube. Das ist zwar sicher nicht 100%ig, aber besser als gar nichts.
Ach ja, auch diverse Webcams schicken Daten Kreuz und Quer durchs Internet zu irgendwelchen dubiosen Server nach China....Sind auch gleich im abgeschottenen Netz gelandet... -
Hallo!
Ich habe mir vor rund 1 Jahr eine neue Flimmerkiste angeschafft. Ich wollte als Betriebsystem unbedingt AndroidTV haben. Grund dafür war das ich doch ganz gerne die eine oder andere APP aus dem Store haben wollte (Kodi, ES-Explorer,..) und auf der anderen Seite auch ein bisschen für die Zukunft sicher zu sein - punkto App.
LG und Samsung haben leider eine "Time-Soll-Bruchstelle", so nach 7 Jahren werden mehr oder weniger alle Geräte kaputt. Leider habe ich das selbst erlebt und ein Reparaturversuch bei einer kleinen Fachwerkstätte hat mir das auch bestädigt. Dort standen fast ausschliesslich LG und Samsung Geräte herum....
Auch wenn diese zwei Hersteller sicher immer die modernsten Technologien haben, die ich nicht unbedigt benötige, bin ich auf einen Grundig Smart TV (75 Zoll) gekommen und muss sagen auch nach einem Jahr bin ich immer noch begeistert.
Ich habe dann noch einen kleiner Fernsehr, das ich einmal bei einem Diskonter (Hofer, in DE heißt er Aldi) günstig erworben habe. Grundsätzlich funktioniert er gut, auch nach vielen Jahren nur das BS ist WebOS. Da ist man schon etwas eingeschränkt. Das was mich am meisten stört ist das er im Menü und bei den App recht langsam ist.
Es kusieren auch Gerüchte das für die große Diskonter eine abgespeckte Geräte produziert werden die auf der einen Seite günstig sind, auf der anderen Seite halt (in dem Fall) etwas langsamere Prozessoren haben....aber als Zweitgerät ist das für mich noch OK.
Was ich bei Smart-Geräten leider noch festgestellt habe: Selbst in den Menüs wird versucht Werbung zu machen (Videoeinblendungen!!) ...Ich habe daher an meinen Router für den Fernsehr die Kindersicherung aktiviert und lasse nur bestimmte DNS-Namen zu...Werbung weg und gut ist es.Ist schwer hier eine Empfehlung zu geben....Ich hoffe Du kannst meine Erfahung nutzen.
lg
Racer -
Hmm...hört sich für mich eher wie Lagerverwaltung an....vielleicht findest Du da in der Richtung was
lg
Racer -
Racer Lass uns teilhaben ...

Aber sicher doch!
Im Anhang sind alle Dateien zum Signieren unter Windows dabei. Der Batchjob ist jetzt nicht perfekt von den Pfadangaben....kann sich ja jeder selber herrichten wie er möchte.
lg
RacerUnd klar, man braucht sein eigenes Codesigner Zertifikat!
-
Hallo!
Auch bei mir in der Arbeit ist das Ausführen von Programmen ganz streng geregelt. Zum Virenscanner, kommt noch Applocker und jetzt seit kurzen der MS Defender mit ERD,... dazu.
Ausnahmen gibt es so gut wie keine...Aber da ich eine Signatur besitze darf ich Programme schreiben und auch ausführen. Nicht nur auf meinen ArbeitsPC sondern auch bei allen anderen Benutzer.
Leider ist es so das die Art wie AutoIT ein lauffähiges Programm erzeugt eine Technik die auch die bösen Leute nutzen und darum schlagen immer wieder die Sicherheitsprogramme an.
Ich habe das Signtool von Windows 10 so lange bearbeitet bis es eine "portable App" geworden ist und rufe das nur via Link und Batchjob auf. Wichtig ist auch der Timestamp! Allerdings wenn kann zu oft den Timestamp vom Internet holt verweigert das Service für eine gewissen Zeit den Zugriff. Daher ist meine Erfahrung das gleich beim Compilieren zu machen eher schlecht.
lg
Racer
-
Auch unter Windows 11 23H2 funktioniert das Tool!
lg
Racer -
Test unter Windows 10 22H2 gesteuert mit einer Benutzer GPO: Der Test-User wurde wie definiert nach 10 Minuten ausgeloggt!
Ich würde sagen voller Erfolg!vielen Danke nochmal an Alle!
lg
Racer -
Liebe AutoITler!
tiefste Verbeugung vor Eurem Nowhow und Eurer Hilfsbereitschaft!
MojoeB : Ja das hat mir meine "Mustererkennung" auch gesagt, aber mir fehlt da einfach Wissen über die Programmiersprachen um das zu verstehen. Das Powershellscript funktioniert nach den ersten Test auch nicht so wie es soll. Bei den Tests hat es mich gleich ausgeloggt - nur um 15 Stunden zu früh.
gmmg : Volltreffer! Das ist genau das was ich gesucht habe. Opensource-Tool und gesteuert via GPO: was gibt es Besseres!
Bericht folgt ob das so funktioniert wie beschrieben
lg
Racer
-
Das hat mir ein Kollege gegben - verstehe ich leider genausoviel wie Dein Script, aber vielleicht kannst Du es mit Deinem kombinieren...
param([string]$ComputerName=".")
$cs=@'
using System;
using System.Runtime.InteropServices;public class WTSSessions
{
public enum WTS_TYPE_CLASS
{
WTSTypeProcessInfoLevel0,
WTSTypeProcessInfoLevel1,
WTSTypeSessionInfoLevel1
}[DllImport("wtsapi32.dll")]
public static extern void WTSFreeMemory(IntPtr ValuePointer);
[DllImport("wtsapi32.dll")]
public static extern void WTSFreeMemoryEx(WTS_TYPE_CLASS Type, IntPtr ValuePointer, int Count);
[DllImport("wtsapi32.dll",SetLastError=true)]
public static extern IntPtr WTSOpenServer(string ServerName);
[DllImport("wtsapi32.dll", SetLastError = true)]
public static extern IntPtr WTSOpenServerEx(string ServerName);
[DllImport("wtsapi32.dll",SetLastError=true)]
public static extern void WTSCloseServer(IntPtr ServerHandle);
[DllImport("wtsapi32.dll", SetLastError = true)]
public static extern bool WTSEnumerateSessions(IntPtr ServerHandle,UInt32 Reserved,UInt32 Version,ref IntPtr pBuffer,ref UInt32 Count);
[DllImport("winsta.dll", SetLastError = true)]
public static extern int WinStationQueryInformationW(IntPtr ServerHandle,uint SessionId,uint WinStationInformation,[Out] IntPtr pBuffer,uint BufferSize,ref uint BytesReturned);
[DllImport("wtsapi32.dll", SetLastError = true)]
public static extern bool WTSLogoffSession(IntPtr ServerHandle,uint SessionId,bool WaitForCompletion);private enum WINSTATIONINFOCLASS
{
WinStationInformation = 8
}public enum WTS_CONNECTSTATE_CLASS
{
WTSActive,
WTSConnected,
WTSConnectQuery,
WTSShadow,
WTSDisconnected,
WTSIdle,
WTSListen,
WTSReset,
WTSDown,
WTSInit
}[StructLayout(LayoutKind.Sequential)]
public struct WINSTATIONINFORMATION
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 72)]
Byte[] Reserved1;
public UInt32 SessionId;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
Byte[] Reserved2;
public System.Runtime.InteropServices.ComTypes.FILETIME ConnectTime;
public System.Runtime.InteropServices.ComTypes.FILETIME DisconnectTime;
public System.Runtime.InteropServices.ComTypes.FILETIME LastInputTime;
public System.Runtime.InteropServices.ComTypes.FILETIME LoginTime;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 1096)]
Byte[] Reserved3;
public System.Runtime.InteropServices.ComTypes.FILETIME CurrentTime;
}public struct WinStationTimestampInfo
{
public int SessionID;
public DateTime Connect;
public DateTime Disconnect;
public DateTime LastInput;
public DateTime Login;
public DateTime Current;
}[StructLayout(LayoutKind.Sequential)]
public struct WTS_SESSION_INFO
{
public uint SessionID;
public string WinStationName;
public WTS_CONNECTSTATE_CLASS State;
}public static WTS_SESSION_INFO[] GetSessions(IntPtr hServer)
{
IntPtr pBuffer = IntPtr.Zero;
IntPtr pWork = IntPtr.Zero;
UInt32 nCount = 0;
WTS_SESSION_INFO[] oaSessionInfo = null;try
{
if (WTSEnumerateSessions(hServer, 0, 1, ref pBuffer, ref nCount))
{
oaSessionInfo = new WTS_SESSION_INFO[nCount];
pWork = pBuffer;for (int nSession = 0; nSession < nCount; nSession++)
{
oaSessionInfo[nSession] = (WTS_SESSION_INFO)Marshal.PtrToStructure(pWork,typeof(WTS_SESSION_INFO));
pWork = new IntPtr(pWork.ToInt64() + 3*IntPtr.Size);
}
WTSFreeMemory(pBuffer);return oaSessionInfo;
}
else
throw new Exception("WTSSessions.GetSessions() failed (Error " + Marshal.GetLastWin32Error() + " in WTSEnumerateSessions)");
}
catch (Exception oExc)
{
if (pBuffer != IntPtr.Zero)
WTSFreeMemory(pBuffer);
throw oExc;
}
}public static DateTime COMFileTimeToDateTime(System.Runtime.InteropServices.ComTypes.FILETIME oFT)
{
long nFT = (((long)oFT.dwHighDateTime) << 32) + oFT.dwLowDateTime;
return DateTime.FromFileTime(nFT);
}public static WinStationTimestampInfo GetTimestamps(IntPtr hServer, uint nSession)
{
WINSTATIONINFORMATION oData = new WINSTATIONINFORMATION();
IntPtr pBuffer;
WinStationTimestampInfo oResult;
uint nBytesReturned;
int nStatus;pBuffer = Marshal.AllocHGlobal(Marshal.SizeOf(oData));
oResult = new WinStationTimestampInfo();
nBytesReturned = 0;
nStatus = WinStationQueryInformationW(hServer, nSession, (uint)WINSTATIONINFOCLASS.WinStationInformation, pBuffer, (uint)Marshal.SizeOf(typeof(WINSTATIONINFORMATION)), ref nBytesReturned);
if (nStatus == 1)
{
oData = (WINSTATIONINFORMATION)Marshal.PtrToStructure(pBuffer, typeof(WINSTATIONINFORMATION));
oResult.Connect = COMFileTimeToDateTime(oData.ConnectTime);
oResult.Current = COMFileTimeToDateTime(oData.CurrentTime);
oResult.Disconnect = COMFileTimeToDateTime(oData.DisconnectTime);
oResult.LastInput = COMFileTimeToDateTime(oData.LastInputTime);
oResult.Login = COMFileTimeToDateTime(oData.LoginTime);
oResult.SessionID = (int)oData.SessionId;
}
Marshal.FreeHGlobal(pBuffer);return oResult;
}}
'@try { [WTSSessions] | Out-Null } catch { Add-Type -TypeDefinition $cs }
$WTS=[WTSSessions]::WTSOpenServer($ComputerName)
$sessions=[WTSSessions]::GetSessions($WTS)
foreach ($session in $sessions)
{
if ($session.WinStationName -eq "Services" -or $session.State -eq [WTSSessions+WTS_CONNECTSTATE_CLASS]::WTSListen)
{
continue;
}$timestamps=[WTSSessions]::GetTimestamps($WTS,$session.SessionID)
if ($session.State -eq [WTSSessions+WTS_CONNECTSTATE_CLASS]::WTSDisconnected)
{
if ($timestamps.Login -eq [System.DateTime]::MinValue)
{
$idle=New-Object System.TimeSpan(0)
}
else
{
$idle=$timestamps.Current.Subtract($timestamps.Disconnect)
}
}
elseif ($session.State -eq [WTSSessions+WTS_CONNECTSTATE_CLASS]::WTSActive)
{
if ($timestamps.Login -eq [System.DateTime]::MinValue)
{
$idle=New-Object System.TimeSpan(0)
}
else
{
$idle=$timestamps.Current.Subtract($timestamps.LastInput)
}
}
else
{
$idle=New-Object System.TimeSpan(0);
}Write-Host "$($session.WinStationName) $($session.State) $($idle)"
if (([int]$idle.TotalHours) -gt 18)
{
Write-Host " ==> LOGOFF"
[WTSSessions]::WTSLogoffSession($WTS,$session.SessionID,$true)
}
}
[WTSSessions]::WTSCloseServer($WTS) -
Hallo MojeB!
Ob es ein Dienst ist oder ein Task der mit Systemrechte getriggert wird ist egal. Wichtig ist das ich diese Idle-Time vom Benutzer herausfinde...lg
Racer -
Hallo Moombas!
Das umloggen ist ein guter Ansatz, aber es ist auch nur ein "anmelden"....wird nicht weiter unterschieden! Der aktive User kann selbst keinen anderen User ausloggen, da fehlen die Rechte dazu.
Ich habe nur die Möglichkeit das im betreffenden Userkontext laufen zu lassen und irgendwie ein loggoff zu ermöglichen oder ich lasse was am System laufen (mit hohen Rechten) der die Usersession auswertet und bei Bedarf dann ein Logoff auf den User/Session macht.
Hätte ich fast vergessen: Das lauft immer nur auf den Client, also keine Auswertung übers Netz (
)Bitte nicht nach den Sinn fragen - das habe ich schon vor langer Zeit aufgegeben. Ich habe einen Scherbenhaufen übergeben bekommen und muss jetzt sehen ich damit klar komme ohne den laufenden Betrieb zu behindern.
Nur so das Du Dir den (Computer)-IQ von meinen Benutzer vorstellen kannst: Nach mehr als 10 Jahre Terminalserver wissen meine User immer noch nicht das man dort ausloggen soll. Alle machen nur das Fenster zu und gehen heim....und wenn man es ihnen sagt ist es ihnen auch egal....lg
Racer
-
Hallo!
Ich stehe vor einer Aufgabe die sich als tückischer als am Anfang geglaubt habe heraus stellt: Es gibt immer (leider) Benutzer die sich einen PC teilen müssen und daher den "schnellen Benutzerwechsel" verwenden. Da ist jetzt noch nichts verwerfliches daran, aber wenn auf doch eher schwach ausgestatten Rechner 10 oder mehr Benutzer angemeldet sind wird das zum Problem.
Jetzt soll ich einen automatischen Logout nach x Stunden Inaktivität machen. GPO gibt da keine (ist keine RDP-Sitztung), Boardmittel sind nicht vorhanden. Jetzt hatte ich die Idee ein kleines Programm dem Benutzer zu gegben der die _Timer_GetIdelTime auswertet und nach einer Zeitvorgabe ein Logoff durchführt.
Jetzt kommt der Teil der leider nicht funktioniert: Das Programm läuft auch weiter wenn sich ein andere Benutzer anmeldet (mit Logfile wegschreiben getestet), nur das logoff sei es aus Autoit oder auch mit logoff.exe wird einfach nicht durchgeführt bzw. einfach ignoriert.
Setzte ich ein logoff /sessionID mit erhöhten Rechten auf den auszuloggenden User ab funktioniert das. Nur aus dem Kontext heraus kann ich nicht die Idle-Time des Benutzer feststellen

Quser.exe hat ein paar Bugs und zeigt nicht immer die richtige Idle-Time an...das hatte ich auch schon am Schirm!Nun zur AutoIT-Frage: gibt es eine Möglichkeit die Idle-Time für alle User abzufragen (mit erhöhten Rechten oder als System? Oder hat wer eine ganz andere Idee wie man das lösen kann?
lg
Racer
-
Für eine asynchrone Anzeige (Hinweis, Zähler,...) habe ich die Funktion mit Adlib sehr zu schätzen gelernt. Vorallem kann das echt Speed in deinen Projekten bringen...
Beipspiel: Du hast eine Schleife mit 100000 Durchläufe, dazwischen Berechnungen und vielleicht ein paar Strings die du noch parsen musst. Wenn Du bei jedem Durchgang die Anzeige refresht kostet das wertvolle Rechenzeit. Nichts Anzeigen frustiert, aber wenn sich die Anzeige nur alle 5 Sekunden ändert sieht man den Fortschritt und das Script läuft richtig flott.
Ist nur ein Gedanke bzw. meine Erfahrungen...
lg
Racer
-
Was mich immer faziniert das wir EDV-Fuzzis für alles ein Programm schreiben müssen
Da ich aber auch so ticke verstehe ich das voll und ganz...
Vielleicht ein paar Anmerkungen:
Man kauft ja immer eine Packung und dort stehen die m2 oben (z.B.: 1.92m2)....da wäre jetzt noch nett wenn die aufgerundet gleich die Packungsanzahl hätte.
Fehlerquote...also wie oft vernichte ich durch vermessen, verschneiden einen Teil; Nichts ist ärgerlicher wenn es sich um 1 ode 2 Bretter (Dielen) wegen der eigenen Unfähigkeit nicht ausgeht. Was dazupasst: Räume sind nie quatratisch und eine Wand ist nie gerade, ganz besonders im Altbau...
Bei mehrern Räumen gibt es Türen und damit einen Durchgang. Das sollte man auch beachten. Ich hatte mal so eine Kaminwand mit Durchgang da hat gleich 1m2 Boden reingepasst...
lg
Racer -
Hallo!
Ist nicht ganz ein AutIT-Thema aber Profile für den Firefox lassen sich sehr leicht und und Profilemanager mit vernünftigen Namen erstellen.
Wichtig ist nur die Ordnerstruktur zu behalten und ein paar Konfigdateien das richtige hinschrieben. Solltest Du für andere Benutzer die Profiles vorab anlegen wollen, dann musst noch ein bisschen mit den Dateirechten herumspielen (ACLs), ist aber nicht wild.....
meiner persönlichen Meinung ist das Profilemanager zum schmeissen...
lg
Racer
-
Hallo!
Ich weiß leider auch keine direkten Weg, aber ich hatte so etwas ähnliches mal: Der Benutzer sollte auf einer GUI ein Systembackup (Diskimage) auslösten können. Dazu war es aber notwendig die Bootauswahl von Windows zu ändern und ein Flag zu setzten.
Ich habe die Programm quasi geteilt: Der Benutzer (nur Userrechte) setzt via GUI ein Flag (Datei oder Registry) und ein Taks hat das überwacht und dann abgearbeitet.
Bei Dir würde es umgekehrt gehen: Ein Benutzertask/Prozess (muss unter den User ausgeführt werden der angemeldet ist) überwacht ein Ereignis das ein anderer Prozess auslöst und dann zeigt der Userprozess an was Du brauchst. Unterm Strich brauchst Du die Möglichkeit eines gemeinsamen Nenners der einen Austausch zwischen Prozessen ermöglicht. Datei oder Registry ist am Einfachsten, TCP/IP auf 127.0.0.1 Port xxx würde auch gehen. Ich bin sicher das hier einige Gurus auch eine Interprozess-Kommunikation (ich glaube so heißt das) kennen-
lg
Racer
-
Hallo!
Da HP immer grauslicher wird und immer wieder Tools einstellt um Biossetting zu machen bzw. auch Updates durchzuführen (nicht interaktiv sondern gescriptet) verwenden wir das BiosSledgehamme-Tool:
GitHub - texhex/BiosSledgehammer: Automated BIOS, ME, TPM firmware update and BIOS settings for HP devicesAutomated BIOS, ME, TPM firmware update and BIOS settings for HP devices - texhex/BiosSledgehammergithub.comBiite unbedingt aufpassen ....damit kann man sich auch ganz schnell einen Client zerschiessen und mehr oder weniger zu Elektroschrott verwandeln....
lg
Racer