import depuis ancien GitHub

This commit is contained in:
David Wuibaille
2025-10-31 08:38:13 +01:00
parent 6f3aeedc93
commit 6a2f2de58e
745 changed files with 178444 additions and 0 deletions

View File

@@ -0,0 +1,298 @@
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Res_Comment=This program connects a drive letter to the preferred server for Windows or WinPE.
#AutoIt3Wrapper_Res_Fileversion=3.0.0.1
#AutoIt3Wrapper_Res_LegalCopyright=LANdesk Software
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#cs ----------------------------------------------------------------------------
AutoIt Version: 3.3.0.0
Author: Jan Buelens, LANDesk Software
Script Function:
Map a drive to the preferred server.
Change History:
V1.0 01 July 2009. Original version. Based on earlier C++ program.
V2.0 020 Jan 2010. Chnaged for LDMS 9.0. PreferredServer.dat file lives in different place and has different format.
V3.0 06 June 2011. Made work in Windows XP (32-bit) and Windows 7 (32 and 64-bit).
#ce ----------------------------------------------------------------------------
; Script Start - Add your code below here
Const $progname = "prefmap V3.0"
Dim $share = ""
Dim $drvletter = ""
Dim $user = ""
Dim $pwd = ""
Dim $varname = ""
Dim $bVerbose = False
Dim $bSilent = False
$logfilename = "" ; log file (from /log command line parameter)
$log = -1
Dim $PrefServerFile8 = ""
Dim $PrefServerFile9 = ""
Dim $CoreServer = ""
Dim $LDMSPath = ""
If IsWinPE() Then
$PrefServerFile8 = "x:\LANDesk\ManagementSuite\sdmcache\preferredserver.dat" ; LDMS WinPE 8.x
$PrefServerFile9 = "x:\ldclient\preferredservers.dat" ; LDMS WinPE 9.0
$CoreServer = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Intel\LANDesk\EventLog", "CoreServer")
Else
If StringInStr(@OSArch, "86") Then
$CoreServer = RegRead("HKEY_LOCAL_MACHINE\Software\Intel\LANDesk\EventLog", "CoreServer")
$PrefServerFile9 = "c:\program files\landesk\ldclient\sdmcache\preferredservers." & $CoreServer & ".dat"
$LDMSPath = "c:\program files\landesk\ldclient\"
ElseIf StringInStr(@OSArch, "64") Then
$CoreServer = RegRead("HKEY_LOCAL_MACHINE\Software\Wow6432Node\Intel\LANDesk\EventLog", "CoreServer")
$PrefServerFile9 = "c:\program files (x86)\landesk\ldclient\sdmcache\preferredservers." & $CoreServer & ".dat"
$LDMSPath = "c:\program files (x86)\landesk\ldclient\"
EndIf
EndIf
Dim $PrefServerFile = ""
; ===========================================================================================
; Validate command line parameters
; ===========================================================================================
For $n = 1 to $CmdLine[0]
$s = ""
If ValParam($CmdLine[$n], "shr", $s) Then
$share = $s
ElseIf ValParam($CmdLine[$n], "drv", $s) Then
$drvletter = $s
ElseIf ValParam($CmdLine[$n], "usr", $s) Then
$user = $s
ElseIf ValParam($CmdLine[$n], "pwd", $s) Then
$pwd = $s
ElseIf ValParam($CmdLine[$n], "var", $s) Then
$varname = $s
ElseIf ValParam($CmdLine[$n], "log", $s) Then
$logfilename = $s
ElseIf $CmdLine[$n] = "/v" Or $CmdLine[$n] = "-v" Then
$bVerbose = True;
Else
Usage()
EndIf
Next
if $logfilename = "" Then $logfilename = StringTrimRight(@ScriptFullPath, 3) & "log"
$log = FileOpen($logfilename, 2)
if $varname = "" Then
; No variable name (/var) is specified. The other 3 parameters (/drv, /shr, /usr) must be present
if $share = "" then Usage()
if $user = "" then Usage()
if $drvletter = "" then Usage()
EndIf
If $share <> "" Or $user <> "" Or $drvletter <> "" Then
; if one of (/drv, /shr, /usr) is present, all 3 must be present
if $share = "" then Usage()
if $user = "" then Usage()
if $drvletter = "" then Usage()
; validate format of /drv
if StringLen($drvletter) > 2 Then Usage()
if StringLen($drvletter) = 1 Then $drvletter &= ":"
if StringRight($drvletter, 1) <> ":" Then Usage()
$drvletter = StringUpper($drvletter)
if $drvletter < "A:" Or $drvletter > "Z:" Then Usage()
EndIf
;If Not IsWinPE() Then ErrorExit("This program must be run under WinPE", 2)
If not GetPrefServerFile() Then
; ===================================================================================
; Use sdclient to download a small dummy file from the core server. As a side effect,
; a preferredserver.dat file is left in x:\LANDesk\ManagementSuite\sdmcache.
; Whether the download is successful does not matter
; ===================================================================================
;$CoreServer = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Intel\LANDesk\LDWM", "CoreServer")
if $bVerbose Then MsgBox(0, $progname, "core server: " & $CoreServer, 5)
If IsWinPE() Then
$SdclientCommandLine = "X:\ldclient\sdclient.exe /f /o /dest=x:\ldclient\win_prov_files.xml /p=http://" & $CoreServer & "/ldlogon/provisioning/win_prov_files.xml"
if $bVerbose Then MsgBox(0, $progname, "command line: " & $SdclientCommandLine, 10)
LogMessage("Dummy download from core server so sdclient/lddwnld.dll gets hold of preferredserver(s).dat")
LogMessage("command line: " & $SdclientCommandLine)
RunWait($SdclientCommandLine, "x:\ldclient")
Else
$SdclientCommandLine = $LDMSPath & "sdclient.exe /f /o /p=http://" & $CoreServer & "/ldlogon/provisioning/win_prov_files.xml /requirepref"
if $bVerbose Then MsgBox(0, $progname, "command line: " & $SdclientCommandLine, 10)
LogMessage("Dummy download from core server so sdclient/lddwnld.dll gets hold of preferredserver(s).dat")
LogMessage("command line: " & $SdclientCommandLine)
RunWait($SdclientCommandLine, $LDMSPath)
EndIf
EndIf
If not GetPrefServerFile() Then ErrorExit("preferredserver(s).dat not found", 3)
LogMessage("preferredserver.dat found at " & $PrefServerFile)
$line = FileReadLine($PrefServerFile)
if $line = "" Then ErrorExit("PreferredServer(s).dat file is empty", 4)
LogMessage("preferredserver(s).dat file contents: " & $line)
; ===================================================================================
; Found preferredserver.dat. It is a text file with no CR-LF. If there are multiple preferred servers,
; they are separated by a semicolon. The preferred server list may or may not be prefixed with a time stamp
; and a question mark.
; Expected formats for LDMS 8.8:
; SERVER1
; SERVER1;SERVER2
; Expected formats for LDMS 8.8:
; 12349439485?SERVER1
; 12349439485?SERVER1;SERVER2
; ===================================================================================
$serverlist = ""
$array = StringSplit($line,"?")
If $array[0] = 1 Then
; there was no question mark
$serverlist = $line
ElseIf $array[0] = 2 Then
; there was 1 question mark - take the substring after the question mark
$serverlist = $array[2]
Else
ErrorExit("preferredserver.dat, invalid format", 41)
EndIf
$array = StringSplit($serverlist,";")
$servername = $array[1]
; ===================================================================================
; When using local user names, we may need something like <machinename>\<username>.
; If the username we got from the command line includes a substring "$server$", replace
; with server name from preferredserver.dat
; ===================================================================================
$user = StringReplace($user, "$server$", $servername)
if $bVerbose Then MsgBox(0, $progname, "preferred server: " & $servername, 5)
LogMessage("preferred server: " & $servername)
if $share <> "" Then
$unc = "\\" & $servername & "\" & $share
if $bVerbose Then MsgBox(0, $progname, "connecting " & $drvletter & " to " & $unc & " as " & $user, 5)
LogMessage("connecting " & $drvletter & " to " & $unc & " as " & $user)
$ret = DriveMapAdd($drvletter, $unc, 0, $user, $pwd)
if $ret = 0 Then
$errmsg = "DriveMapAdd(" & $drvletter & ", " & $unc & ", " & $user & ", <pwd>) failed. "
if @error = 1 Then $errmsg &= "Win32 error code " & @extended
if @error = 2 Then $errmsg &= "Access Denied"
if @error = 3 Then $errmsg &= "Drive letter already assigned"
if @error = 4 Then $errmsg &= "Invalid drive letter"
if @error = 5 Then $errmsg &= "UNC path not found"
if @error = 6 Then $errmsg &= "Invalid password"
ErrorExit($errmsg, 5)
EndIf
if $bVerbose Then MsgBox(0, $progname, "connection successful", 5)
LogMessage("connection successful")
EndIf
if $varname <> "" Then
$base = "HKLM\System\CurrentControlSet\Control\Session Manager\Environment"
RegWrite($base, $varname, "REG_SZ", $servername)
if @error Then ErrorExit("RegWrite, error " & @error, 6)
LogMessage("Environment variable set")
EndIf
FileClose($log)
; ===========================================================================================
; The location of the preferredserver.dat file is different between LDMS 8.8 and 9.0. This function looks in the
; two possible places and sets a global variable ($PrefServerFile) to the correct path. If the file is found in
; neither place, the return value is false.
Func GetPrefServerFile()
; ===========================================================================================
$PrefServerFile = ""
If FileExists($PrefServerFile8) Then
$PrefServerFile = $PrefServerFile8
Return True
EndIf
If FileExists($PrefServerFile9) Then
$PrefServerFile = $PrefServerFile9
Return True
EndIf
Return False
EndFunc
; ===========================================================================================
; Return true if running under WinPE
Func IsWinPE()
; ===========================================================================================
If EnvGet("SystemDrive") = "X:" Then Return True
Return False
EndFunc
; ===========================================================================================
Func ErrorExit($msg, $exitcode)
; ===========================================================================================
LogMessage($msg)
FileClose($log)
if not $bSilent Then MsgBox(0x40010, $progname, $msg, 10) ; 10 is timeout, i.e. the msgbox closes after 10 seconds
Exit $exitcode
EndFunc
; ===========================================================================================
; parse command line parameter such as /keyw=something. Examples:
; ValParam("/path=c:\temp", "path", $value) sets $value to "c:\temp" and returns True
; ValParam("-path=c:\temp", "path", $value) sets $value to "c:\temp" and returns True
; ValParam("/path=c:\temp", "dir", $value) sets $value to "" and returns False
Func ValParam($param, $keyword, ByRef $value)
; ===========================================================================================
$value = ""
Local $p1 = "/" & $keyword & "="
Local $p2 = "-" & $keyword & "="
Local $len = StringLen($p1)
if StringLen($param) < ($len + 1) Then Return False
Local $t = StringLeft($param, $len)
if ($t <> $p1) And ($t <> $p2) Then Return False
$value = StringMid($param, $len + 1) ; 1 based
Return True
EndFunc
; ===========================================================================================
Func LogMessage($msg)
; ===========================================================================================
FileWriteLine($log, $msg)
EndFunc
; ===========================================================================================
Func Usage()
; ===========================================================================================
Msgbox (0, $progname & " by Jan Buelens", _
"This program maps a drive to the preferred server." & @CRLF _
& @CRLF & "Usage:" _
& @CRLF & " /shr= share" _
& @CRLF & " /drv= drive letter" _
& @CRLF & " /usr= user name" _
& @CRLF & " /pwd= password" _
& @CRLF & " /var= environment variable" _
& @CRLF & " /v verbose" & @CRLF _
& @CRLF & "Use this program only under WinPE." _
& @CRLF & "If there are multiple preferred servers, the first one will be used." _
& @CRLF & "If you are using a local machine account to connect, you may want to" _
& @CRLF & "include a $server$ substring in the user name. The program will replace" _
& @CRLF & "it with the preferred server name." _
& @CRLF & "" _
& @CRLF & "If a /var parameter is specified, a system environment variable will" _
& @CRLF & "set to the preferred server name. You probably need the RunEnv tool to" _
& @CRLF & "use the environment variable. If you only want prefmap to set an" _
& @CRLF & "environment variable, without mapping a drive, use the /var parameter" _
& @CRLF & "only." _
& @CRLF & "" _
)
Exit 1
EndFunc