Danke Dir! ![]()
Beiträge von Surfy
-
-
Danke Dir, Schnitzel!
Lustig, das kann ich beim normalen kopieren reproduzieren

Jetzt geht das programm, aber es wird nichts kopiert *kopfkratz* Robocopy ist im System32 Verzeichniss, aber es wird weder ein Verzeichniss namens C:\Robocopy-Beispiel angelegt, noch kopiert falls ich es anlege

-
Hallo zusammen
Würde gerne ein Logfile auswerten, und das Ergebniss erhalten wieviel MB gelöscht werden, und wieviele zu kopieren sind.
Das Logfile sieht so aus:
ZitatAlles anzeigen-------------------------------------------------------------------------------
ROBOCOPY :: Robust File Copy for Windows :: Version XP010
-------------------------------------------------------------------------------Started : Tue Jul 12 16:04:15 2011
Source : C:\Robocopy\Copy\Source\
Dest : C:\Robocopy\Copy\Destion\Files : *.*
Options : *.* /X /FP /L /S /E /COPY:DAT /PURGE /MIR /ZB /R:3 /W:1
------------------------------------------------------------------------------
1 C:\Robocopy\Copy\Source\
*EXTRA File 59 C:\Robocopy\Copy\Destion\cleaner.au3
*EXTRA File 255824 C:\Robocopy\Copy\Destion\cleaner.exe
*EXTRA File 2.1 m C:\Robocopy\Copy\Destion\Orca.Msi
New File 79872 C:\Robocopy\Copy\Source\robocopy.exe------------------------------------------------------------------------------
Total Copied Skipped Mismatch FAILED Extras
Dirs : 1 0 1 0 0 0
Files : 1 1 0 0 0 3
Bytes : 78.0 k 78.0 k 0 0 0 2.43 m
Times : 0:00:00 0:00:00 0:00:00 0:00:00Ended : Tue Jul 12 16:04:15 2011
Interressant wäre also nur die Zeilen " *EXTRA File" und die Zeilen mit "New File"
Hat vielleicht jemand sowas schon mal gemacht? Es soll auf ein Directory compare hinauslaufen, mit über 20 GB Daten... Daher wäre ein Script schon klasse

-
Wenn ich das Ausführen will, erhalte ich folgende Fehler

C:\test\copy.au3(85,27) : ERROR: syntax error
If NotNot @error
~~~~~~~~~~~~~~~~~~~~~~~~~~^
C:\test\copy.au3(116,27) : ERROR: syntax error
If NotNot @error
~~~~~~~~~~~~~~~~~~~~~~~~~~^
C:\test\copy.au3(129,27) : ERROR: syntax error
If NotNot @error
~~~~~~~~~~~~~~~~~~~~~~~~~~^
C:\test\copy.au3 - 3 error(s), 0 warning(s)Was ist da falsch?
-
Herzlichen Dank an alle Beteiligten!
Nun läufts wie geschmiert.
Schnuffel, auch mit deiner Version ging es nicht, gleiche Fehlermeldung.
Ich habe dann ein Include aus einem meiner geposteten Links verwendet:_RefreshTrayIcons.au3 Damit
_RefreshTrayIcons.au3
-
Zitat
Ich weiß ja nicht ob du vor hast Office 2010 im AKW aufzuspielen oder ob deine Benutzer 24/7 online sein müssen.
Jo, dass ist vielleicht bissl übertrieben, aber macht ja auch spass - hab schon wieder viel gelernt.
Ich hab jetzt eigentlich alles soweit gepackt - hatte nicht dran gedacht, dass ich im Service noch eine Exe starten kann, die die Executable mit ProcessWaitClose überwacht, und anschliessend den Systray refresht

Der Service läuft unter Systemcontext, die Exe die den Service überwacht auch. Das einzige Problem ist, dass es einen Error gibt, wenn ein User sich während der Installation anmeldet:
Autoit Error:
Line 22 (File "C:\Program Files\ProzessWatch\reloader.exe")
Error: Subscript used with non-Array variables
Das blöde: an Zeile 22 ist gar nichts infrage kommendes:
Hier der Quellcode der reloader.exe
[autoit]#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
[/autoit][autoit][/autoit][autoit]
#AutoIt3Wrapper_icon=xxx\_Icons\awt_SECURITY_WARNING_0.ico
#AutoIt3Wrapper_UseUpx=n
#AutoIt3Wrapper_Res_Comment=SystemTrayReloader
#AutoIt3Wrapper_Res_Description=xx
#AutoIt3Wrapper_Res_Fileversion=1.0.0.0
#AutoIt3Wrapper_Res_LegalCopyright=xx
#AutoIt3Wrapper_Res_Field=Made By|xx
#AutoIt3Wrapper_Res_Field=Email| [email='xx@xx.com'][/email]
#AutoIt3Wrapper_Res_Field=Compile Date|%date% %time%
#AutoIt3Wrapper_AU3Check_Parameters=-q -d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
#AutoIt3Wrapper_Run_After=copy "%in%" "..\..\Programs_Updates\AutoIt3Wrapper"
#AutoIt3Wrapper_Run_After=copy "%out%" "..\..\Programs_Updates\AutoIt3Wrapper"
#AutoIt3Wrapper_Run_After=copy "%in%" "c:\Program Files (x86)\autoit3\SciTE\AutoIt3Wrapper"
#AutoIt3Wrapper_Run_After=aaCopy2Prod.exe "%scriptfile%.EXE" "%out%" "C:\Program Files (x86)\AutoIt3\SciTE\AutoIt3Wrapper" "%in%" %fileversion% %fileversionnew%
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****;#AutoIt3Wrapper_Res_Field=AutoIt Version|%AutoItVer%
[/autoit][autoit][/autoit][autoit]
;#AutoIt3Wrapper_Res_Field=Credits|wraithdu - Updating the Resource UDFs allowing other sections to be included.
#cs ----------------------------------------------------------------------------
AutoIt Version: 3.3.6.1
Author: xxx
Script Function:
Template AutoIt script.
#ce ----------------------------------------------------------------------------Opt("TrayIconHide", 1)
[/autoit]
ProcessWaitClose("ProZessWatch.exe")
Local $iMode = Opt("WinTitleMatchMode", 4)
Local $hControl = ControlGetHandle("[CLASS:Shell_TrayWnd]", "", "[CLASSNN:ToolbarWindow321]")
Local $acSize = WinGetClientSize($hControl)
For $x = 0 To $acSize[0] Step 5
For $Y = 0 To $acSize[1] Step 5
DllCall("user32.dll", "lparam", "SendMessage", "hwnd", $hControl, "int", 0x0200, "wparam", 0, "lparam", BitOR($Y * 0x10000, BitAND($x, 0xFFFF)))
Next
Next -
Ich sehe langsam mein Problem: Meine Exe was den Systray refreshen soll - läuft unter dem Usercontext der Softwareverteilung, und kommt so nicht an den Systray des eingeloggten Users heran.
Da hilft wohl nur ein 2ter Service einrichten, der den refresh macht...

-
Inzwischen habe ich Google nochmals intensiv beharkt:
Das ist das aktuellste was ich gefunden habe:
http://www.autoitscript.com/forum/topic/94…-refresh-redux/ bis Vista
http://www.autoitscript.com/forum/topic/103871-systray-udf/ inkl Win7
Dann gibts auch noch
http://www.autoitscript.com/forum/topic/13704-systray-udf/
http://www.autoitscript.com/forum/topic/74…reshsystemtray/
Was haltet ihr von Link 1?
-
Ein Reboot ist nicht notwendig, es funktioniert auch so. Natürlich soll der Rollout über Nacht stattfinden, aber einige werden es sicher schaffen, den PC geloggt laufen zu lassen - um dann am nächsten Tag beglückt zu werden.
[autoit]
[/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit]
_refresh()
Func _refresh()
RUNWAIT (@COMSPEC & ' /c eventcreate /t information /so installer /id 100 /l application /d "Start of Trayrefresh triggered ',"",@SW_HIDE)
Local $iMode = Opt("WinTitleMatchMode", 4)
Local $hControl = ControlGetHandle("[CLASS:Shell_TrayWnd]", "", "[CLASSNN:ToolbarWindow321]")
Local $acSize = WinGetClientSize($hControl)
For $x = 0 To $acSize[0] Step 5
For $Y = 0 To $acSize[1] Step 5
DllCall("user32.dll", "lparam", "SendMessage", "hwnd", $hControl, "int", 0x0200, "wparam", 0, "lparam", BitOR($Y * 0x10000, BitAND($x, 0xFFFF)))
Next
Next
RUNWAIT (@COMSPEC & ' /c eventcreate /t information /so installer /id 100 /l application /d "End of Trayrefresh triggered ',"",@SW_HIDE)
EndFuncIch habe jetzt eine ausgelagerte Exe mit obenstehendem Code gemacht, die ich mit "Run" aufrufe. So bleibt wenigstens meine Exe nicht stehen, und die Installation geht weiter. Aber die Prozesse bleiben stehen! Dh der zweite Eventcreate Aufruf wird nie getriggert

Mit doppelklick geht das aber..
-
Nun stellt sich die Frage: gehe ich nach dem Prozess?
[autoit]If ProcessExists("explorer.exe") Then
[/autoit]oder WMI?
[autoit]
[/autoit]
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
MsgBox(4096, "Test", $sLoggedInUser & " " & $sLoggedInDomain , 10)Oder Frage in der Registry den DefaultUserName ab? *verwirrtschau*
[autoit]$RegUser = RegRead("HKLM\Software\Microsoft\Windows NT\CurrentVersion\WinLogon", "DefaultUserName")
[/autoit]Was ist das zuverlässigste?
-
Hui, danke für die rege Beteiligung!
Hintergrund:
Ich habe zwei Programme, die in dem Systemtray angezeigt werden, auf dieser Basis:
[ offen ] Verhindern dass mehrere Programme ausgeführt werden
Erst kommt ein Fenster, das während der Deinstallation von Office 2003 angezeigt wird, danach wird ein Fenster eingeblendet während der Installation von Office 2010.
Leider bleiben dann beide im Systemtray "sichtbar" Programm1 ist schon beendet, wird aber noch eine ganze weile im Systray angezeigt. Das ist insbesondere dann blöd, wenn die Migration vorbei ist, und der User eigentlich arbeiten könnte.
Ziel ist natürlich, den Rollout/die Migration nachts laufen zu lassen, mit etwas glück sehen nicht viele oder niemand mein Kunstwerk

Daher bin ich hier nun an Programm3 - welches den Systray refreshen soll - damit die inaktiven kreierten Programme daraus verschwinden.
Dazu reicht ein einmaliger Aufruf der Funktion! Aber der darf nicht crashen...
Mit crashen meine ich: Das exe bleibt stehen, der Prozess beendet nicht - und die Migration geht nicht voran..
Misterspeeds vorschlag geht wohl in die richtige Richtung: Abfragen ob ein User eingeloggt ist, und NUR dann die function aufrufen. Problem bleibt da der Runas Prozess der Software verteilung - der vielleicht dann anstelle eines Users connected wird.
Wie kann man einen eingeloggten User erkennen? Muss das so komplex passieren wie zB hier? [ gelöst ] Angemeldeten Benutzer ermitteln (vom System-Konto)
-
danke fürs Helfen!
Das ist schon der ganze Script!
Der Script bzw die Exe wurde von der Softwareverteilung gestartet, als kein User eingeloggt war.
Vielleicht hat das etwas damit zu tun? Deine Idee hat was - nur würde mir ein einmaliger Aufruf völlig ausreichen:
Dh eine Schlaufe die 30sek läuft, und dann unbeachtet dessen, wo die Schleife gerade steht, sich beenden kann.
Eigentlich hilft der ganze Trayrefresh nur, wenn ein User aktiv eingeloggt ist. Wichtig ist also nur, dass die Exe nicht hängen bleibt, wenn kein User eingeloggt ist.
Da die Softwareverteilung auch mit einem Runas arbeitet, würde man mit @UserName etc wohl in die irre geführt.
Surfy
-
Hallo zusammen
Im englischen Forum hatte ich diese Zeilen gefunden, und adaptiert/übernommen:
[autoit]Local $iMode = Opt("WinTitleMatchMode", 4)
[/autoit]
Local $hControl = ControlGetHandle("[CLASS:Shell_TrayWnd]", "", "[CLASSNN:ToolbarWindow321]")
Local $acSize = WinGetClientSize($hControl)
For $x = 0 To $acSize[0] Step 5
For $Y = 0 To $acSize[1] Step 5
DllCall("user32.dll", "lparam", "SendMessage", "hwnd", $hControl, "int", 0x0200, "wparam", 0, "lparam", BitOR($Y * 0x10000, BitAND($x, 0xFFFF)))
Next
NextQuelle: http://www.autoitscript.com/forum/topic/10…__1#entry728342
Das funktioniert insofern, das inaktive Prozesse im Systemtray ausgeblendet werden, bzw verschwinden. Wie es genau funktioniert, weiss ich allerdings nicht, die paar Zeilen scheinen jeden Systemtray durchzugehen?! Das übersteigt eindeutig meinen horizont..
Leider scheint es nun vorzukommen, dass meine Exe hängen bleibt, dh es passiert einfach nichts mehr

Was ist an obenstehendem falsch? Wieso kann es hängen bleiben? Wie kann ich es so verpacken, dass es in einer Schlaufe aufgerufen wird, die nur 30 sek lang läuft, und sich dann beendet egal was innerhalb der Schlaufe passiert?
Oder gibt es da noch einen anderen Ansatz?
Ich hoffe ihr wisst rat!
Surfy
-
Danke Dir Water!
Ich werde die Exe als Service einrichten, wenn alles fertig ist, beenden und löschen..
-
Danke für den Tip! Also ungefähr so:
[autoit]while 1
[/autoit]
$list = ProcessList("winword.exe")
for $i = 1 to $list[0][0]
;msgbox(0, $list[$i][0], $list[$i][1])
RunAs ( 'MyUser', 'MyDomain', 'MyPassWord', 0, @ComSpec & ' /c taskkill.exe /F /IM ' & $list[$i][0], @WindowsDir ,@SW_HIDE )
next
ToolTip("Office 2010 Migration is active, Kills: " &$i, 550, 0)
Sleep(5000)
$list = ProcessList("excel.exe")
for $i = 1 to $list[0][0]
;msgbox(0, $list[$i][0], $list[$i][1])
RunAs ( 'MyUser', 'MyDomain', 'MyPassWord', 0, @ComSpec & ' /c taskkill.exe /F /IM ' & $list[$i][0], @WindowsDir ,@SW_HIDE )
next
Sleep(5000)
WEndDas funktioniert

Wäre es irgendwie noch möglich, den Killcounter aus dem ersten Beispiel zu integrieren?:
[autoit]$i += 1
[/autoit]
ToolTip("Office 2010 Migration is active, Kills: " &$i, 550, 0)Leider reicht dafür mein Skill nicht

-
Hallo zusammen
Ich würde gerne im Rahmen der Officemigration verhindern, dass Office Komponten auf dem PC gestartet werden können, während des Setups/Remove.
Der einzige weg der mir einfällt, ist nun mehrere Exefiles zu machen, nach diesem Muster, die jeweils einen Prozess abfragen:
[autoit]$i = 0
[/autoit]
while 1
ProcessWait("winword.exe")
RunAs ( 'myuser', 'mydomain', 'mypassword', 0, @ComSpec & ' /c taskkill.exe /F /IM winword.exe', @WindowsDir ,@SW_HIDE )
$i += 1
ToolTip("Office 2010 Migration is active, Kills: " &$i, 550, 0)
Sleep(5000)
WEndGibt es eine Möglichkeit, dies innerhalb einer Exe Datei abzufangen? Wie? So dass weder Outlook.exe, Winword.exe, Excel.exe gestartet werden können?
Surfy
-
woah woah - was für geniale sachen - die es hier gibt

Ich habe gerade den fall, dass ich via ADSI Abfrage, den Full qualified Computername (workstation.domain.com) abfragen soll.
Nur habe ich keinen blassen, was zb in FQDNToDisplayname genutzt wird *kopfkratz*
Ist das eine AutoIt ADSI abfrage?
-
I
ch bin leider noch ein ziemlicher AutoIt Noob - aber vielleicht kann ich Dir ja doch ein paar denkanstösse geben. Anscheinend willst Du die vollen Angaben zu den Permissions... Ich glaube da brauchst Du dann mehr wie WMI

Mit den komandozeilentools subinacl und setacl kann man die berechtigung ausgeben lassen, auf den Schirm, und DOS gerecht natürlich auch zb in eine Datei, um dass dann so weiter zu bearbeiten.
-
Herzlichen Dank! Damit gehts

Danke Dir Schnitzel & natürlich auch allen anderen Helfern

-
Anbei die Datei:
Ich habe den Namen natürlich in dem Script jeweils angepasst.