Powershell Lokaler User

Antworten
ksmz
Beiträge: 14
Registriert: 30 Okt 2019, 16:04

Powershell Lokaler User

Beitrag von ksmz »

Hi,

aktuell versuche ich ein Opsi Paket zu bauen, welches mir flexibel locale user anlegen kann. Direkt mit Powershell funktioniert die GEschichte, aber in Verbindung mit Opsi winscript funktioniert es nicht. Habt Ihr einen Tipp? Ich habe schon gelesen, dass mit Windows 1809 sich hinsichtlich Powershell Sicherheit einiges geändert hat und dann noch was mit unblock usw gelesen, jedoch sollte es auch so funktionieren? Hier das Skript, vielleicht fällt jemand ein grober schnitzer auf...

Code: Alles auswählen

[Actions]
requiredWinstVersion >= "4.11.2.1"
 
setLogLevel=3
DefVar $ProductName$
DefVar $local_user$
DefVar $Group$
DefVar $SearchResult$
DefVar $val_userpasswd$
DefVar $val_username$
DefVar $val_groupmember$
DefVar $UserExists$
DefVar $UserGroup$
DefVar $date_tomorrow$
DefVar $pwd_expires$
DefVar $ExitCode$
DefVar $ErrorMsg$
 
DefVar $LogDir$

Set $LogDir$ = "%opsiLogDir%" 
 
DefStringlist $ResultList$
DefStringlist $ResultList2$
DefStringlist $ResultList3$
 
 
comment "val_userpasswd"
comment "description: password"
;Set $val_userpasswd$ = GetProductProperty("val_userpasswd", "SecurePW!")
 
comment "val_username"
comment "description: admin username"
;Set $local_user$= GetProductProperty("val_username", "locsupp")
 
comment "val_groupmember"
comment "description: Groupemembership"
;Set $UserGroup$= GetProductProperty("val_groupmember", "Administratoren")
 
comment "get the name of the admin group"

Message "Installing Local User"
   
 

   comment "Start setup program"
   ChangeDirectory "%SCRIPTPATH%"
   ;----------------------------------------------
   DosInAnIcon_setpolicy
   ExecWith_powershell powershell.exe winst /64Bit 
   set $exitcode$ = getLastExitcode
   if not ($exitcode$ = "0")
        comment "powershell script failed"
   endif



[DosInAnIcon_setpolicy]
echo "powershell set-executionpolicy RemoteSigned ..."
powershell.exe set-executionpolicy RemoteSigned
exit %ERRORLEVEL%

[ExecWith_powershell]
# set Variables from Properties

$UserNames = @("Admin1;User1;User2")
$UserPasswords = @("pwadmin3KKJ!!!;pwlKe6er1211K2!;pwlKe99er1211K2")
$UserGroups = @("Administratoren;Benutzer;Benutzer")

;$UserGroups = '$Usergroup$'
$ArrayGroups = $UserGroups.split(";")

;$UserNames = '$local_user$'
$ArrayUserNames = $Usernames.split(";")

;$UserPasswords = '$val_userpasswd$'
$ArrayUserPasswords = $UserPasswords.split(";")


# start checking array sizes
if ($ArrayUserNames.Length -ne $ArrayGroups -ne $ArrayUserPasswords) {
  write-host "Array sizes of Usergroups, Usernames or Userpasswords does not fit"
  exit 1

#set-executionpolicy unrestricted

$ArrayUserNames = $Usernames.split(";")
$ArrayUserPasswords = $UserPasswords.split(";")
$ArrayGroups = $UserGroups.split(";")

# start checking array sizes
if ($ArrayUserNames.Length -ne $ArrayGroups -ne $ArrayUserPasswords) {
  write-host "Array sizes of Usergroups, Usernames or Userpasswords does not fit"
  exit 1
}

$ErrorActionPreference = 'Stop'
$VerbosePreference = 'Continue'

# start looping
For ($i=0; $i -lt $ArrayUserNames.Length; $i++) {
  $ObjLocalUser = $null
  Try {
    Write-Verbose "Searching for $($ArrayUserNames[$i]) in LocalUser DataBase"
    $ObjLocalUser = Get-LocalUser $ArrayUserNames[$i]
    Write-Verbose "User $($ArrayUserNames[$i]) was found"
  }

  Catch [Microsoft.PowerShell.Commands.UserNotFoundException] {
    "User $($ArrayUserNames[$i]) was not found" | Write-Warning
  }

  Catch {
    "An unspecifed error occured" | Write-Error
    Exit 2# Stop Powershell! 
  }

  #Create the user if it was not found (Example)
  If (!$ObjLocalUser) {
    Write-Verbose "Creating User $($ArrayUserNames[$i])" #(Example)
    $SecurePassword = ConvertTo-SecureString $ArrayUserPasswords[$i] -AsPlainText -Force
    New-LocalUser -Name $ArrayUserNames[$i] -Password $SecurePassword -AccountNeverExpires -PasswordNeverExpires -FullName $ArrayUserNames[$i] -UserMayNotChangePassword
    # Add User to group
    Add-LocalGroupMember -Group $ArrayGroups[$i] -Member $ArrayUserNames[$i] 
  }
}
Benutzeravatar
tobias
Beiträge: 1291
Registriert: 20 Aug 2008, 12:36
Wohnort: Braunschweig
Kontaktdaten:

Re: Powershell Lokaler User

Beitrag von tobias »

Moin,

habe ich auch probiert und das Ergebnis war:
Geht nicht, da es diesen Befehl als Systemuser (in diesem Kontext läuft OPSI) nicht gibt.... Hab mich dann nicht weiter mit dem Thema beschäftigt.

Gruß
Tobias
RobWo
Beiträge: 8
Registriert: 30 Aug 2019, 08:58

Re: Powershell Lokaler User

Beitrag von RobWo »

Also ich benutze auch die Powershell, um lokale Benutzer anzulegen.
Innerhalb der Powershell benutze ich aber alte CMD-Befehle. Hier mal ein Auszug aus meinem Skript.. Vielleicht hilft es dir weiter:

Code: Alles auswählen

NET USER USERNAME PASSWORT /ADD /PASSWORDCHG:NO /ACTIVE:YES /EXPIRES:NEVER
wmic USERACCOUNT WHERE "NAME='USERNAME'" SET PasswordExpires=False
;lokaler User der Admingruppe hinzufügen
NET localgroup administratoren USERNAME /add
Setz doch mal zum Troubleshooten das LogLevel auf 7 und poste dieses dann hier rein. Da kann man immer ganz gut Schritt für Schritt die Problematik erkennen. Vorallem werden im Loglevel 7 auch die Rückgaben der Powershell geschrieben.

Code: Alles auswählen

setLogLevel=3
Gruß,
Robin
ksmz
Beiträge: 14
Registriert: 30 Okt 2019, 16:04

Re: Powershell Lokaler User

Beitrag von ksmz »

@ pandel, danke für die Info. Dein Paket hatte ich schon vorher gefunden, jedoch wollte ich es mit Powershell umsetzen. Desweiteren soll mein Paket mehrere User anlegen können....

@ tobias, danke fürs testen. Dachte die befehle müssten auch als system user funktionieren, da es keine AD Befehle oder sonstwas beinhaltet, das müsste ich nochmal checken, danke für den tipp...

@ RobWo, danke für den CodeSchnippsel, wollte eigentlich von den batch skripten weg kommen.....ich check mal den Tipp von Tobias und falls das nicht fruchtet, erhöhe ich den Loglevel

Danke euch für die Tipps und Infos....
Andreas
ksmz
Beiträge: 14
Registriert: 30 Okt 2019, 16:04

Re: Powershell Lokaler User

Beitrag von ksmz »

Hi,
ich nochmal.

folgendes Powershell Skript funktioniert unter win10 1803 als system user (psexec -i -s powershell_ISE.exe), d.h. es legt die User an. Im Opsi Kontext funktionierts nicht...

Code: Alles auswählen

$UserNames = @("Admin1;User32;User4")
$UserPasswords = @("pwadmin3KKJ!!!;pwlgger1211K2!;pwlKeggr1211K2")
$UserGroups = @("Administratoren;Benutzer;Benutzer")

$ArrayUserNames = $Usernames.split(";")
$ArrayUserPasswords = $UserPasswords.split(";")
$ArrayGroups = $UserGroups.split(";")

# start checking array sizes
if ($ArrayUserNames.Length -ne $ArrayGroups -ne $ArrayUserPasswords) {
  write-host "Array sizes of Usergroups, Usernames or Userpasswords does not fit"
  exit 1
}

$ErrorActionPreference = 'Stop'
$VerbosePreference = 'Continue'

# start looping
For ($i=0; $i -lt $ArrayUserNames.Length; $i++) {
  $ObjLocalUser = $null
  Try {
    Write-Verbose "Searching for $($ArrayUserNames[$i]) in LocalUser DataBase"
    $ObjLocalUser = Get-LocalUser $ArrayUserNames[$i]
    Write-Verbose "User $($ArrayUserNames[$i]) was found"
  }

  Catch [Microsoft.PowerShell.Commands.UserNotFoundException] {
    "User $($ArrayUserNames[$i]) was not found" | Write-Warning
  }

  Catch {
    "An unspecifed error occured" | Write-Error
    Exit 2# Stop Powershell! 
  }

  #Create the user if it was not found (Example)
  If (!$ObjLocalUser) {
    Write-Verbose "Creating User $($ArrayUserNames[$i])" #(Example)
    $SecurePassword = ConvertTo-SecureString $ArrayUserPasswords[$i] -AsPlainText -Force
    New-LocalUser -Name $ArrayUserNames[$i] -Password $SecurePassword -AccountNeverExpires -PasswordNeverExpires -FullName $ArrayUserNames[$i] -UserMayNotChangePassword
    # Add User to group
    Add-LocalGroupMember -Group $ArrayGroups[$i] -Member $ArrayUserNames[$i] 
  }
}
ksmz
Beiträge: 14
Registriert: 30 Okt 2019, 16:04

Re: Powershell Lokaler User

Beitrag von ksmz »

aktuelles Opsi Script wie folgt(hab noch bei Powershell executewith was geändert)

Code: Alles auswählen

[Actions]
requiredWinstVersion >= "4.11.2.1"
 
setLogLevel=7
DefVar $ProductName$
DefVar $local_user$
DefVar $Group$
DefVar $SearchResult$
DefVar $val_userpasswd$
DefVar $val_username$
DefVar $val_groupmember$
DefVar $UserExists$
DefVar $UserGroup$
DefVar $date_tomorrow$
DefVar $pwd_expires$
DefVar $ExitCode$
DefVar $ErrorMsg$
 
DefVar $LogDir$

Set $LogDir$ = "%opsiLogDir%" 
 

;$ProductId$ should be the name of the product in opsi
; therefore please: only lower letters, no umlauts, 
; no white space use '-' as a seperator

 
 
comment "val_userpasswd"
comment "description: password"
;Set $val_userpasswd$ = GetProductProperty("val_userpasswd", "SecurePW!")
 
comment "val_username"
comment "description: admin username"
;Set $local_user$= GetProductProperty("val_username", "locsupp")
 
comment "val_groupmember"
comment "description: Groupemembership"
;Set $UserGroup$= GetProductProperty("val_groupmember", "Administratoren")
 
comment "get the name of the admin group"

Message "Installing Local User"

   comment "Start setup program"
   ;ChangeDirectory "%SCRIPTPATH%"
   ;----------------------------------------------
   DosInAnIcon_setpolicy
   ExecWith_powershell "%System%\WindowsPowerShell\v1.0\powershell.exe" winst /SysNative
   set $exitcode$ = getLastExitcode
   if not ($exitcode$ = "0")
        comment "powershell script failed"
   endif



[DosInAnIcon_setpolicy]
echo "powershell set-executionpolicy RemoteSigned ..."
powershell.exe set-executionpolicy RemoteSigned

[ExecWith_powershell]
$UserNames = @("Admin1;User2;User3")
$UserPasswords = @("pwadmin3KKJ!!!;pwlKehhghr1211K2!;pwlKehhg55r1211K2!")
$UserGroups = @("Administratoren;Benutzer;Benutzer")

$ArrayUserNames = $Usernames.split(";")
$ArrayUserPasswords = $UserPasswords.split(";")
$ArrayGroups = $UserGroups.split(";")

$ErrorActionPreference = 'Stop'
$VerbosePreference = 'Continue'

# start looping
For ($i=0; $i -lt $ArrayUserNames.Length; $i++) {
  $ObjLocalUser = $null
  Try {
    Write-Verbose "Searching for $($ArrayUserNames[$i]) in LocalUser DataBase"
    $ObjLocalUser = Get-LocalUser $ArrayUserNames[$i]
    Write-Verbose "User $($ArrayUserNames[$i]) was found"
  }

  Catch [Microsoft.PowerShell.Commands.UserNotFoundException] {
    "User $($ArrayUserNames[$i]) was not found" | Write-Warning
  }

  Catch {
    "An unspecifed error occured" | Write-Error
    Exit 2# Stop Powershell!
  }

  #Create the user if it was not found (Example)
  If (!$ObjLocalUser) {
    Write-Verbose "Creating User $($ArrayUserNames[$i])" #(Example)
    $SecurePassword = ConvertTo-SecureString $ArrayUserPasswords[$i] -AsPlainText -Force
    New-LocalUser -Name $ArrayUserNames[$i] -Password $SecurePassword -AccountNeverExpires -PasswordNeverExpires -FullName $ArrayUserNames[$i] -UserMayNotChangePassword
    # Add User to group
    Add-LocalGroupMember -Group $ArrayGroups[$i] -Member $ArrayUserNames[$i]
  }
}

Code: Alles auswählen

(140)     [6] [Nov 04 14:31:07:510] [teska-local-user]   ExitCode 1
(141)     [7] [Nov 04 14:31:07:510] [teska-local-user]           
(142)     [7] [Nov 04 14:31:07:510] [teska-local-user]           output:
(143)     [7] [Nov 04 14:31:07:510] [teska-local-user]           --------------
(144)     [7] [Nov 04 14:31:07:510] [teska-local-user]           c:\opsi.org\tmp\_opsiscript_Sa28En58.ps1 : Die Datei "C:\opsi.org\tmp\_opsiscript_Sa28En58.ps1" kann nicht geladen
(145)     [7] [Nov 04 14:31:07:510] [teska-local-user]           werden, da die Ausführung von Skripts auf diesem System deaktiviert ist. Weitere Informationen finden Sie unter
(146)     [7] [Nov 04 14:31:07:510] [teska-local-user]           "about_Execution_Policies" (https:/go.microsoft.com/fwlink/?LinkID=135170).
(147)     [7] [Nov 04 14:31:07:510] [teska-local-user]           In Zeile:1 Zeichen:1
(148)     [7] [Nov 04 14:31:07:511] [teska-local-user]           + c:\opsi.org\tmp\_opsiscript_Sa28En58.ps1
(149)     [7] [Nov 04 14:31:07:511] [teska-local-user]           + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
(150)     [7] [Nov 04 14:31:07:511] [teska-local-user]               + CategoryInfo          : Sicherheitsfehler: (:) [], PSSecurityException
(151)     [7] [Nov 04 14:31:07:511] [teska-local-user]               + FullyQualifiedErrorId : UnauthorizedAccess
(152)     [7] [Nov 04 14:31:07:511] [teska-local-user]   
(153)     [7] [Nov 04 14:31:07:517] [teska-local-user] The file: c:\opsi.org\tmp\_opsiscript_Sa28En58.ps1 has been deleted
jemand einen Tipp? Das Problem müssten mehrere User haben. Ich schieb ja extra noch ein

Code: Alles auswählen

[DosInAnIcon_setpolicy]
echo "powershell set-executionpolicy RemoteSigned ..."
powershell.exe set-executionpolicy RemoteSigned
exit %ERRORLEVEL%
vor...

VG
Andreas
RobWo
Beiträge: 8
Registriert: 30 Aug 2019, 08:58

Re: Powershell Lokaler User

Beitrag von RobWo »

Hey,

ein Auszug aus dem Winst Manual..

Da per Windows Default die Execution Policy der Powershell auf Restricted steht können Scripte nicht ohne weiteres
ausgeführt werden. Daher hat der Befehl powershellCall per default folgendes Verhalten: Die aktuelle executionpolicy
wird gesichert und die execution-policy auf RemoteSigned gesetzt. Dann wird das Script ausgeführt und abschließend
die Execution-policy wieder zurück gesetzt.[...]


Beispiel:

Code: Alles auswählen

set $list$= powersshellCall(’Get-Process -ProcessName "opsi*"’)
Ist eine Abkürzung für den Ausdruck:

Code: Alles auswählen

set $policy$ = takeString(0,shellCall(’powershell.exe get-executionpolicy’))
shellCall(’powershell.exe set-executionpolicy RemoteSigned’)
set $list$ = getOutStreamFromSection (’Execwith_ps powershell.exe winst /sysnative’)
shellCall(’powershell.exe set-executionpolicy ’+$policy$)
[Execwith_ps]
trap { write-output $_ ; exit 1 }
Get-Process -ProcessName "opsi*"
exit $LASTEXITCODE
Also wenn ich meine Skripte komplett in ein powershellCall() reinpfeffere funktioniert das eigentlich. Wobei ich sagen muss, dass ich immer nur 2 bis 3 Zeilen Code einfüge.

Vielleicht probierst du es mal aus und führst alles in der gleichen Aktionssektion aus:
Also deine Setpolicy Routine mit in die eigentliche Ausführung einpflegen.

Ich könnte mir vorstellen, dass nach der Aktion DosInAnIcon_setpolicy die Remotepolicy automatisch zurückgesetzt wird?
Man kann's ja mal testen ;)

Grüße gehen raus.
Robin
Antworten