Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Benutzerdefiniertes Update mit Windows SteadyState

Frage Microsoft Windows XP

Mitglied: SarekHL

SarekHL (Level 3) - Jetzt verbinden

30.10.2013, aktualisiert 17:15 Uhr, 1811 Aufrufe, 2 Kommentare

Hallo zusammen,

kennt sich hier noch jemand mit SteadyState aus? Das war das Programm von Microsoft, mit dem man unter Windows XP einen PC in den "Kiosk-Modus" versetzen konnte, und mit dem auch ein Festplattenschutz à la HD-Guard, Drive.Keeper usw. möglich war.

Wenn man so einen Festplattenschutz aktiv hat, ist natürlich das Problem, daß Software-Updates (z.B. von Anti-Virus-Programmen) nicht möglich waren bzw. nach dem nächsten Neustart wieder entfernt wurden. SteadyState konnte die Windows-Updates von Haus aus einspielen, für andere Updates konnte man ein Update-Script erstellen und dieses durch SteadyState aufrufen lassen. Dazu startete SteadyState den Rechner zu einem bestimmten Zeitpunkt neu (nur bis zum Anmeldemaske), spielte dann die Updates ein und übernahme die Änderungen dauerhaft.

Ich habe nun einen Präsentationsrechner unter Windows XP laufen, der mit SteadyState geschützt wird. Auf diesem Rechner soll nun auch Avira Professional Security installiert werden. Der Rechner selbst ist zwar durch den Festplattenschutz schon weitgehend gegen Malware geschützt, aber zur Laufzeit könnte natürlich durchaus ein Wurm den Rechner befallen und von dort aus andere Rechner im Netzwerk attackieren.

Nun habe ich ein Update-Script (in VB6) geschrieben und dies als EXE-Datei compiliert, auf dem Rechner hinterlegt und in SteadyState eingebunden, so daß es täglich um 6 Uhr aufgerufen wird. Das Script ruft die Update-Funktion von Avira als Administrator auf und wartet dann, bis die update.exe wieder beendet ist:


Formularmodul
01.
Private Sub Form_Load() 
02.
 
03.
 
04.
Dim AdminName As String 
05.
Dim AdminPassword As String 
06.
Dim AdminDomain As String 
07.
Dim ExecCommand As String 
08.
Dim ExecDirectory As String 
09.
Dim ExecOptions As String 
10.
Dim CheckEXE As String 
11.
 
12.
AdminName = "Administrator" 
13.
AdminPassword = "anzeige" 
14.
AdminDomain = "Display" 
15.
ExecDirectory = "c:\programme\avira\antivir desktop\" 
16.
ExecCommand = "avcenter.exe" 
17.
ExecOptions = "/STARTSILENTUPDATE" 
18.
CheckEXE = "update.exe" 
19.
 
20.
 
21.
' Kontrolleintrag ins Log schreiben 
22.
Open "d:\avira.log" For Append As 1 
23.
Print #1, Format(Now(), "yyyy.mm.dd-HH:MM:SS") & ";Programm gestartet" 
24.
Close 1 
25.
 
26.
 
27.
' Aufruf des Avira Updates als Administrator 
28.
Dummy = W2KRunAsUser(AdminName, AdminPassword, AdminDomain, Chr(34) & ExecDirectory & ExecCommand & Chr(34) & " " & ExecOptions, ExecDirectory) 
29.
 
30.
 
31.
' Kontrolleintrag ins Log schreiben 
32.
Open "d:\avira.log" For Append As 1 
33.
Print #1, Format(Now(), "yyyy.mm.dd-HH:MM:SS") & ";Aufruf " 
34.
Close 1 
35.
 
36.
 
37.
' Warten bis avcenter.exe die update.exe aufgerufen hat 
38.
Do 
39.
DoEvents 
40.
Loop Until IsEXERunning(CheckEXE) = -1 
41.
 
42.
 
43.
' Kontrolleintrag ins Log schreiben 
44.
Open "d:\avira.log" For Append As 1 
45.
Print #1, Format(Now(), "yyyy.mm.dd-HH:MM:SS") & ";update.exe läuft" 
46.
Close 1 
47.
 
48.
 
49.
' Warten bis update.exe durchgelaufen ist 
50.
Do 
51.
DoEvents 
52.
Loop Until IsEXERunning(CheckEXE) <> -1 
53.
 
54.
 
55.
' Kontrolleintrag ins Log schreiben 
56.
Open "d:\avira.log" For Append As 1 
57.
Print #1, Format(Now(), "yyyy.mm.dd-HH:MM:SS") & ";Update finished" 
58.
Close 1 
59.
 
60.
 
61.
' Fünf Minuten zuwarten 
62.
Start = Timer 
63.
Do While Timer < Start + 300 
64.
DoEvents 
65.
Loop 
66.
 
67.
 
68.
' Kontrolleintrag ins Log schreiben 
69.
Open "d:\avira.log" For Append As 1 
70.
Print #1, Format(Now(), "yyyy.mm.dd-HH:MM:SS") & ";Pause finished" 
71.
Close 1 
72.
 
73.
 
74.
' Programm schließen 
75.
Dim oForm As Form 
76.
For Each oForm In VB.Forms 
77.
    Unload oForm 
78.
  Next 
79.
   
80.
 
81.
End Sub

Modul "Funktionen"
01.
' zunächst die benötigten API-Deklarationen 
02.
Private Declare Function CreateToolhelpSnapshot Lib "Kernel32" _ 
03.
  Alias "CreateToolhelp32Snapshot" ( _ 
04.
  ByVal lFlgas As Long, _ 
05.
  ByVal lProcessID As Long) As Long 
06.
  
07.
Private Declare Function ProcessFirst Lib "Kernel32" _ 
08.
  Alias "Process32First" ( _ 
09.
  ByVal hSnapshot As Long, _ 
10.
  uProcess As PROCESSENTRY32) As Long 
11.
  
12.
Private Declare Function ProcessNext Lib "Kernel32" _ 
13.
  Alias "Process32Next" ( _ 
14.
  ByVal hSnapshot As Long, _ 
15.
  uProcess As PROCESSENTRY32) As Long 
16.
  
17.
Private Declare Function LogonUser Lib "advapi32.dll" Alias _ 
18.
        "LogonUserA" _ 
19.
        (ByVal lpszUsername As String, _ 
20.
        ByVal lpszDomain As String, _ 
21.
        ByVal lpszPassword As String, _ 
22.
        ByVal dwLogonType As Long, _ 
23.
        ByVal dwLogonProvider As Long, _ 
24.
        phToken As Long) As Long 
25.
 
26.
Private Declare Function CreateProcessAsUser Lib "advapi32.dll" _ 
27.
        Alias "CreateProcessAsUserA" _ 
28.
        (ByVal hToken As Long, _ 
29.
        ByVal lpApplicationName As Long, _ 
30.
        ByVal lpCommandLine As String, _ 
31.
        ByVal lpProcessAttributes As Long, _ 
32.
        ByVal lpThreadAttributes As Long, _ 
33.
        ByVal bInheritHandles As Long, _ 
34.
        ByVal dwCreationFlags As Long, _ 
35.
        ByVal lpEnvironment As Long, _ 
36.
        ByVal lpCurrentDirectory As String, _ 
37.
        lpStartupInfo As STARTUPINFO, _ 
38.
        lpProcessInformation As PROCESS_INFORMATION) As Long 
39.
 
40.
Private Declare Function CreateProcessWithLogonW Lib "advapi32.dll" _ 
41.
        (ByVal lpUsername As String, _ 
42.
        ByVal lpDomain As String, _ 
43.
        ByVal lpPassword As String, _ 
44.
        ByVal dwLogonFlags As Long, _ 
45.
        ByVal lpApplicationName As Long, _ 
46.
        ByVal lpCommandLine As String, _ 
47.
        ByVal dwCreationFlags As Long, _ 
48.
        ByVal lpEnvironment As Long, _ 
49.
        ByVal lpCurrentDirectory As String, _ 
50.
        ByRef lpStartupInfo As STARTUPINFO, _ 
51.
        ByRef lpProcessInformation As PROCESS_INFORMATION) As Long 
52.
       
53.
Private Declare Function CloseHandle Lib "kernel32.dll" _ 
54.
        (ByVal hObject As Long) As Long 
55.
                              
56.
Private Declare Function SetErrorMode Lib "kernel32.dll" _ 
57.
        (ByVal uMode As Long) As Long 
58.
         
59.
Private Declare Function GetVersionExA Lib "kernel32.dll" _ 
60.
    (lpVersionInformation As OSVERSIONINFO) As Integer 
61.
 
62.
 
63.
Private Type PROCESSENTRY32 
64.
  dwSize As Long 
65.
  cntUsage As Long 
66.
  th32ProcessID As Long 
67.
  th32DefaultHeapID As Long 
68.
  th32ModuleID As Long 
69.
  cntThreads As Long 
70.
  th32ParentProcessID As Long 
71.
  pcPriClassBase As Long 
72.
  dwflags As Long 
73.
  szexeFile As String * MAX_PATH 
74.
End Type 
75.
 
76.
Private Type STARTUPINFO 
77.
    cb As Long 
78.
    lpReserved As Long ' !!! must be Long for Unicode string 
79.
    lpDesktop As Long  ' !!! must be Long for Unicode string 
80.
    lpTitle As Long    ' !!! must be Long for Unicode string 
81.
    dwX As Long 
82.
    dwY As Long 
83.
    dwXSize As Long 
84.
    dwYSize As Long 
85.
    dwXCountChars As Long 
86.
    dwYCountChars As Long 
87.
    dwFillAttribute As Long 
88.
    dwflags As Long 
89.
    wShowWindow As Integer 
90.
    cbReserved2 As Integer 
91.
    lpReserved2 As Long 
92.
    hStdInput As Long 
93.
    hStdOutput As Long 
94.
    hStdError As Long 
95.
End Type 
96.
 
97.
Private Type PROCESS_INFORMATION 
98.
    hProcess As Long 
99.
    hThread As Long 
100.
    dwProcessId As Long 
101.
    dwThreadId As Long 
102.
End Type 
103.
 
104.
Private Type OSVERSIONINFO 
105.
    dwOSVersionInfoSize As Long 
106.
    dwMajorVersion As Long 
107.
    dwMinorVersion As Long 
108.
    dwBuildNumber As Long 
109.
    dwPlatformId As Long 
110.
    szCSDVersion As String * 128 
111.
End Type 
112.
                              
113.
 
114.
Private Const TH32CS_SNAPPROCESS As Long = 2& 
115.
Private Const MAX_PATH As Long = 260 
116.
  
117.
Private Const CREATE_DEFAULT_ERROR_MODE = &H4000000 
118.
 
119.
Private Const LOGON_WITH_PROFILE = &H1 
120.
Private Const LOGON_NETCREDENTIALS_ONLY = &H2 
121.
 
122.
Private Const LOGON32_LOGON_INTERACTIVE = 2 
123.
Private Const LOGON32_PROVIDER_DEFAULT = 0 
124.
    
125.
Private Const VER_PLATFORM_WIN32_NT = &H2 
126.
 
127.
'  CreateProcessAsUser() requires that the caller has the following permissions 
128.
'  Permission                        Display Name 
129.
'  --------------------------------------------------------------- 
130.
'  SE_ASSIGNPRIMARYTOKEN_NAME       Replace a process level token 
131.
'  SE_INCREASE_QUOTA_NAME           Increase quotas 
132.
   
133.
 
134.
Public Function W2KRunAsUser(ByVal UserName As String, _ 
135.
        ByVal Password As String, _ 
136.
        ByVal DomainName As String, _ 
137.
        ByVal CommandLine As String, _ 
138.
        ByVal CurrentDirectory As String) As Long 
139.
  
140.
    Dim si As STARTUPINFO 
141.
    Dim pi As PROCESS_INFORMATION 
142.
  
143.
    Dim wUser As String 
144.
    Dim wDomain As String 
145.
    Dim wPassword As String 
146.
    Dim wCommandLine As String 
147.
    Dim wCurrentDir As String 
148.
  
149.
    Dim Result As Long 
150.
  
151.
    si.cb = Len(si) 
152.
  
153.
    wUser = StrConv(UserName + Chr$(0), vbUnicode) 
154.
    wDomain = StrConv(DomainName + Chr$(0), vbUnicode) 
155.
    wPassword = StrConv(Password + Chr$(0), vbUnicode) 
156.
    wCommandLine = StrConv(CommandLine + Chr$(0), vbUnicode) 
157.
    wCurrentDir = StrConv(CurrentDirectory + Chr$(0), vbUnicode) 
158.
  
159.
    Result = CreateProcessWithLogonW(wUser, wDomain, wPassword, _ 
160.
          LOGON_WITH_PROFILE, 0&, wCommandLine, _ 
161.
          CREATE_DEFAULT_ERROR_MODE, 0&, wCurrentDir, si, pi) 
162.
    ' CreateProcessWithLogonW() does not 
163.
    If Result <> 0 Then   'Result ist bool Wert. 
164.
        CloseHandle pi.hThread 
165.
        CloseHandle pi.hProcess 
166.
        W2KRunAsUser = 0 
167.
    Else 
168.
        W2KRunAsUser = Err.LastDllError 
169.
        MsgBox "CreateProcessWithLogonW() failed with error " & _ 
170.
          Err.LastDllError, vbExclamation 
171.
    End If 
172.
  
173.
End Function 
174.
 
175.
 
176.
' Prüft, ob eine EXE-Datei bereits ausgeführt wird 
177.
Public Function IsEXERunning(ByVal sFilename As String) As Long 
178.
  
179.
  Dim lSnapshot As Long 
180.
  Dim uProcess As PROCESSENTRY32 
181.
  Dim nResult As Long 
182.
  
183.
  ' "Snapshot" des aktuellen Prozess ermitteln 
184.
  lSnapshot = CreateToolhelpSnapshot(TH32CS_SNAPPROCESS, 0&) 
185.
  If lSnapshot <> 0 Then 
186.
    uProcess.dwSize = Len(uProcess) 
187.
  
188.
    ' Ersten Prozess ermitteln 
189.
    nResult = ProcessFirst(lSnapshot, uProcess) 
190.
  
191.
    Do Until nResult = 0 
192.
      ' Prozessliste durchlaufen 
193.
      If InStr(LCase$(uProcess.szexeFile), LCase$(sFilename)) > 0 Then 
194.
        ' Jepp - EXE gefunden 
195.
        IsEXERunning = True 
196.
        Exit Do 
197.
      End If 
198.
  
199.
      ' nächster Prozess 
200.
      nResult = ProcessNext(lSnapshot, uProcess) 
201.
    Loop 
202.
  
203.
    ' Handle schliessen 
204.
    CloseHandle lSnapshot 
205.
  End If 
206.
End Function

Das klappt hervorragend, wenn ich an dem PC angemeldet bin und das Programm manuell starte. Das Update wird dann ordnungsgemäß durchgeführt, ist aber natürlich beim nächsten Reboot wieder weg.

Beim Aufruf über SteadyState schlägt das Script aber fehl. Da ich an verschiedenen Stellen eine Kontrollzeile in eine Protokolldatei (auf eine nicht durch den Festplattenschutz geschützte Partition) schreiben lasse, weiß ich auch wo, nämlich beim Aufruf der Funktion W2KRunAsUser. Die Kontrollzeile, die direkt nach diesem Aufruf geschrieben werden sollte, fehlt bereits.


Hat jemand eine Idee, warum das nicht klappt?



Danke im Voraus,
Sarek
Mitglied: DerWoWusste
30.10.2013 um 20:02 Uhr
Moin.

Kann es wohl sein, dass das ausführende Konto (vermutlich System) gar nicht für runas genutzt werden kann?
Lass die Impersonation doch einmal weg und führ es einfach aus, ohne den Admin anzugeben.

BItte antworte auch noch in dem Update-Thread http://www.administrator.de/forum/konzept-f%c3%bcr-updates-von-firefox- ...
Bitte warten ..
Mitglied: SarekHL
30.10.2013, aktualisiert um 21:15 Uhr
Zitat von DerWoWusste:
Kann es wohl sein, dass das ausführende Konto (vermutlich System) gar nicht für runas genutzt werden kann?
Lass die Impersonation doch einmal weg und führ es einfach aus, ohne den Admin anzugeben.

Das habe ich mir vorhin auch schon überlegt. Ich habe das Programm inzwischen angepaßt und verwende jetzt einen normalen Shell-Aufruf. Ich kann aber veraussichtlich erst am Freitag ausprobieren, ob es klappt

Edit: Ich konnte es doch via VPN und RDP jetzt noch testen. Es funktioniert ;)



Da bin ich noch nicht weiter zu gekommen, und da das eher ein allgemeines und nicht dringend anstehendes Thema ist, muß das leider erst mal warten.
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(4)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Windows 10
gelöst Windows 10 Update gefriert (10)

Frage von KodaCH zum Thema Windows 10 ...

Windows 10
gelöst Windows 10 - Datum und Zeitfehler bei Update (3)

Frage von swisstom zum Thema Windows 10 ...

Windows Server
Windows-Update für Secure-Boot-Fehler macht BIOS-Updates erforderlich (2)

Link von Penny.Cilin zum Thema Windows Server ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...

Outlook & Mail
Outlook 2010 findet ost datei nicht (18)

Frage von Floh21 zum Thema Outlook & Mail ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (17)

Frage von Unwichtig zum Thema Netzwerkmanagement ...