Nein leider nicht. Mit LEFT-JOIN hatte ich auch schon ein paar Versuche gestartet. Trotzdem Danke.
Wenns gar nicht anders geht, werde ichs wohl etwas umbasteln müssen. Also die Tabelle software_installed.
Nein leider nicht. Mit LEFT-JOIN hatte ich auch schon ein paar Versuche gestartet. Trotzdem Danke.
Wenns gar nicht anders geht, werde ichs wohl etwas umbasteln müssen. Also die Tabelle software_installed.
Hm, liegt bei mir vllt daran, dass ich die service.au3 verwendet hab um den dienst einzurichten. Vllt ist die RunAsSvc besser.
Guck ich mir mal bei gelegenheit an.
Wenn es als Dienst installiert ist:
Dienste -> Eigenschaften vom Dienst öffnen -> Tab anmelden -> Haken bei "Datenaustausch zwischen Dienst und Desktop zulassen" -> Übernehmen
Funktioniert bei XP, bei Server 2003 nicht.
Ich geb dir mal ein paar Stichworte:
Scriptomatic
WMI: Win32_DesktopMonitor
Besonders intressant ist der Wert Availability
http://msdn.microsoft.com/en-us/library/…28VS.85%29.aspx
Habs grade ausprobiert, da gings aber nicht, könnte daran liegen dass noch ein kvm switch dazwischen hängt.
Also, wie auf dem Bild zusehen habe ich 3 Tabellen.
Ich bräuchte eine Abfrage die mir, general.host und software_check.name zurückgibt.
Dabei sollen nur die Einträge zurückgegebenwerden die nicht in der Tabelle software_installed geführt sind.
Kurz gesagt, ich will wissen welche Software auf welchem Rechner NICHT installiert ist.
[Anmerkung: software_installed listet nur was wirklich installiert ist, software_check listet alles was überprüft wird]
Bin leider noch ziemlich unerfahren was SQL angeht und wäre für einen Tipp wie man das Problem angeht sehr dankbar.
Leider treten einige Fehler nur auf bestimmten Systemen auf.
Dann ist es aber meistens schon kompiliert und der Interpreter wirft etwas aus wie "Fehler in Zeile soundso".
Die Zeilenangabe ist zumindest bei mir wegen der includes nicht hilfreich. Wie bekommt man also den Quelltext wie ihn der Compiler zusammenbaut
damit man sich die Problemstelle ansehen kann?
Den Tipp von hier: [ gelöst ] Quelltext in der Exe-Datei archivieren
hab ich schon versucht, allerdings werden die includes da noch nicht aufgelöst.
Der Quelltext sieht also genauso aus wie im Editor.
Hat jemand eine Idee wie man dem Fehler auf die Spur kommt?
Auch von mir alles Gute
Und das wurde mit Win7 geändert?
Naja gut zu Wissen. Danke
Wenn man explizit einen Benutzernamen angibt und damit ein Netzlaufwerk erstellt gehts.
Finde ich aber irgendwie eine unschöne Lösung. (Die durchaus folgeprobleme nach sich ziehen kann)
Versteh einfach nicht warum es scheinbar nicht mit den Rechten vom SYSTEM-Konto gestartet wird.
Unter Win7 gehts doch auch ... ?
Per Gruppenrichtlinie lasse ich ein Startskript (noch vor der Anmeldung) ausführen. Das Script soll dabei ein Programm starten dass sich in einem freigegebenen Ordner befindet.
Das Startskript wird mit dem Benutzer "SYSTEM" gestartet, sollte also auf alles Zugriff haben.
Mit Windows 7 funktioniert das auch einwandfrei, Mit Windows XP hingegen nicht.
Hat jemand eine Idee wo das Problem liegt?
Anstatt ein Programm von einem dritthersteller zu nehmen kannst du dir auch mal den code hier ansehen
http://www.autoitscript.com/forum/index.php?showtopic=29772
Hey interessantes Projekt. Arbeite derzeit an einem nahezu identischen System.
Vllt können wir ja was voneinander lernen wenn beide hier veröffentlicht sind.
(Sofern du das vorhast)
hab die Funktion folgendermaßen umgeschrieben:
Func _GetUsername()
Local $sLoggedInUser = "", $sLoggedInDomain = "", $sResults = ""
$objWMIService = ObjGet("winmgmts:" & "{impersonationLevel=impersonate}!\\localhost\root\cimv2")
If IsObj($objWMIService) Then
$colComputer = $objWMIService.ExecQuery("Select * from Win32_ComputerSystem")
For $objComputer In $colComputer
$sLoggedInUser = $objComputer.UserName
Next
If StringInStr($sLoggedInUser,"\") Then
$iSplit = StringInStr($sLoggedInUser,"\")
$sLoggedInDomain = StringTrimRight($sLoggedInUser,(StringLen($sLoggedInUser) - $iSplit)+1)
$sLoggedInUser = StringTrimLeft($sLoggedInUser,$iSplit)
EndIf
;If $sLoggedInDomain <> "" Then $sResults &= "Logged in domain: " &$sLoggedInDomain &@CRLF
If $sLoggedInUser = "" Then $sLoggedInUser = "n.a"
Else
$sLoggedInUser = "n.a"
EndIf
Return $sLoggedInUser
EndFunc
und es läuft. vielen Dank
Also ich habe ein Startskript, dass von einem domain-controller ausgeführt wird, also noch bevor ein Benutzer sich anmeldet.
Das Skript wird entsprechend mit dem System-Account ausgeführt. Aufgrund der UAC geht das leider nicht anders da das Skript Adminrechte benötigt.
Es wartet bis die explorer.exe gestartet wurde. Dann soll es ermitteln welcher benutzer angemeldet ist.
@Username liefert nur "SYSTEM" zurück.
RegRead("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer", "Logon User Name") liefert "", also leerer String.
Hat noch jemand eine Idee wie man den angemeldeten Benutzer herausbekommt?
Als möglichkeit würde mir noch einfallen, den Benutzernamen ermitteln, der dem Prozess explorer.exe zugewiesen ist.
Weiß aber leider nicht wie das geht
Klar, viel extra Code braucht man dafür nicht.
Ältere, umfangreichere Scripte nachträglich ändern kann aber aufwendig werden.
Zur Laufzeit den Code passend ändern ist doch ein Vorteil den ein Interpreter bietet, warum also nicht nutzen?
Würde auch ein wenig die Fehleranfälligkeit runter schrauben.
Ich hab mich gerade gefragt ob es nicht sinnvoller wäre wenn der Interpreter zur Laufzeit selbst überprüft ob es ein 32 oder ein 64 Bit System ist und den Hauptschlüssel selbst anpasst?
Würde die kompatibilität auch von älteren Scripten verbessern. Möglich müsste dass doch sein oder?
Weiß jemand ob von den Entwicklern in der richtung etwas geplant ist?
Hast du dir schonmal TrueCrypt angesehen?
Davon gibt es auch eine portable Version. Es mountet eine Containerdatei als Netzlaufwerk, die verschlüsselung wird wieder aktiv wenn das Laufwerk ausgehangen wird (Im TrueCrypt programm).
Die Anforderung "- Dateien per Doppelklick entschlüsseln und mit der verknüpften Anwendung öffnen" und portable schließen sich eigentlich aus,
Programme die wirklich portable sind, ändern auch nicht die Registrierung.
Hab mal versucht die funktion so zu ändern dass automatisch die Zeile umgebrochen wird wenn die Länge zu groß ist
aber irgendwie funktioniert es nicht richtig. Ich finde auch den Fehler auf anhieb nicht. Hat jemand eine idee?
EDIT: Nochmal etwas geändert, der Code für den Zeilenumbruch ist wohl noch etwas wackelig, aber sonst gehts schon ganz gut
Func _GetTextSize($nText, $AutoCRLFWidth=0, $iFontSize = 12, $sFont = 'Microsoft Sans Serif', $iFontAttributes = 0)
Local $DUMMY, $ainfo, $iWidth, $iHeight, $retArr[4]
Local $WordArr[1][1], $tmpArr, $SpaceSize, $WordSize, $CRLFString, $LineSize=0, $lines=0
If $sFont = "" Then $sFont = 'Microsoft Sans Serif'
;Author: Bugfix
;Modified: funkey
If $nText = '' Then Return
$hOld = GUISwitch($DUMMY)
Local $hGUI = GUICreate("Textmeter by Bugfix")
_GDIPlus_Startup()
Local $hFormat = _GDIPlus_StringFormatCreate(0)
Local $hFamily = _GDIPlus_FontFamilyCreate($sFont)
Local $hFont = _GDIPlus_FontCreate($hFamily, $iFontSize, $iFontAttributes, 3)
Local $tLayout = _GDIPlus_RectFCreate(15, 171, 0, 0)
Local $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
;Zeilenumbrüche einfügen
If $AutoCRLFWidth > 0 Then
$tmpArr = StringSplit($nText, " ")
Redim $WordArr[$tmpArr[0]+1][2]
;_ArrayDisplay($tmpArr)
;Daten übertragen
$WordArr[0][0] = $tmpArr[0]
For $i = 1 To $tmpArr[0]
$WordArr[$i][0] = $tmpArr[$i]
Next
;_ArrayDisplay($WordArr)
;Breite eines Leerzeichens
$aInfo = _GDIPlus_GraphicsMeasureString($hGraphic, " ", $hFont, $tLayout, $hFormat)
$SpaceSize = Ceiling(DllStructGetData($aInfo[0], "Width"))
For $i = 1 To $WordArr[0][0]
;Länge der einzelnen Wörter ausrechnen
$aInfo = _GDIPlus_GraphicsMeasureString($hGraphic, $WordArr[$i][0], $hFont, $tLayout, $hFormat)
$WordArr[$i][1] = Ceiling(DllStructGetData($aInfo[0], "Width"))
;Falls erforderlich Zeilenumbruch einfügen
If $Linesize + $WordArr[$i][1] + $SpaceSize > $AutoCRLFWidth Then
$CRLFString = $CRLFString & @CRLF & $WordArr[$i][0]
$LineSize = $WordArr[$i][1]
$lines = $lines + 1
Else
$CRLFString = $CRLFString & " " & $WordArr[$i][0]
$LineSize = $LineSize + $WordArr[$i][1] + $SpaceSize
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $LineSize = ' & $LineSize & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
EndIf
Next
;unnötige Leerzeichen entfernen
$CRLFString = StringStripWS($CRLFString, 3)
$nText=$CRLFString
EndIf
$aInfo = _GDIPlus_GraphicsMeasureString($hGraphic, $nText, $hFont, $tLayout, $hFormat)
$iWidth = Ceiling(DllStructGetData($aInfo[0], "Width"))
$iHeight = Ceiling(DllStructGetData($aInfo[0], "Height"))
Msgbox(0,"debug", $nText)
;Ressourcen freigeben
_GDIPlus_StringFormatDispose($hFormat)
_GDIPlus_FontDispose($hFont)
_GDIPlus_FontFamilyDispose($hFamily)
_GDIPlus_GraphicsDispose($hGraphic)
_GDIPlus_Shutdown()
GUIDelete($hGUI)
$retArr[0] = $iWidth
$retArr[1] = $iHeight
$retArr[2] = $lines + 1
$retArr[3] = $nText
GUISwitch($hOld)
Return $retArr
EndFunc ;==>_GetTextSize
Func AutoSizeSplash($Title, $Content, $Width=500, $xpos=-1, $ypos=-1, $opt=32, $fontname="", $fontsize=12)
Local $SizeArr = _GetTextSize($Content, $Width, $fontsize, $fontname)
If $SizeArr[3] = "" Then $SizeArr[3] = $Content
If $SizeArr[0] > $Width Then $Width = $SizeArr[0]
_ArrayDisplay($SizeArr)
SplashTextOn($Title, $SizeArr[3], $Width, $SizeArr[1] + 30, $xpos, $ypos, $opt, $fontname, $fontsize)
EndFunc
#include <gdiplus.au3>
#include <array.au3>
AutoSizeSplash("Hallo Welt", "Das ist ein ganz ganz langer text mit vielen" & @CRLF & @CRLF & "vielen Wörtern zum Gucken ob es funktioniert." & _
" Deswegen kommen jetzt noch ein paar mehr Zeichen und hier ist schließlich Ende.", 600 ,-1,-1, 33, "", 14)
Sleep(5000)
SplashOff()
Nee, damit geht es leider auch nicht
Mist, wenn man einstellt, dass der Text vertial zentriert angezeigt werden soll, dann funktioniert nichtmal mehr der automatische zeilenumbruch