Roan
Roan

Reputation: 932

How can I set the "Environment" > "Start the following program at logon" property on a local user using powershell?

Background:
I have a server with Windows 2008 R2 installed running as a terminal server session host. I have a long list of local users set-up and configured as remote desktop users. When the users remotely log on using remote desktop connection, a program automatically starts up. When the user closes that program, the session ends. This all works fine if I set it up manually.

My Question:
I have written a script to add a list of local users automatically and setup and configure the properties. The problem is that nowhere can I find how to set the "Environment" > "Start the following program at logon" properties. (See image for the properties I want to set)

enter image description here

A sample portion of my current script is as follow:

  $computer = "localhost"
  $userName = "aTestUser"
  $objComputer = [ADSI]"WinNT://$computer"
  $objUser = $objComputer.Create('user', $userName)
  $objUser.SetPassword("Password")
  $objUser.PSBase.InvokeSet('Description', "Some description for $userName")
  $objUser.PSBase.InvokeSet('userflags', 512)
  $objUser.PSBase.InvokeSet('passwordExpired', 1)
  $objUser.SetInfo();

I also tried this command which doesn't work:

  $objUser.PSBase.InvokeSet("TerminalServicesInitialProgram", "C:\programs\a_test_program.exe")  

I have searched on Microsoft's MSDN site and Google and StackOverflow but could not find this specific property.

Upvotes: 5

Views: 4025

Answers (2)

Roan
Roan

Reputation: 932

Okay, so I finally got it working. Seems like you have to first create the user then open it again for editing before the InvokeSet sets the TerminalServicesInitialProgram property.
I am not sure, maybe someone can share some experience or explanation.
Thank you to everyone for your help and assistance.

Working Code:

    # Read the CSV file and create the users
    # The CSV file structure is:
    # UserName,FullName,Description
    $Users = Import-Csv -Path "C:\Users.csv"
    foreach ($User in $Users)            
    {
        # adds user
        $computer = "localhost"
        $username = $User.UserName
        #$username = "atest001"
        $fullname = $User.FullName
        #$fullname = "My Name"
        $description = $User.Description
        #$description = "A new user description"
        $password = "MyGreatUnbreakableSecretPassword"
        $objComputer = [ADSI]"WinNT://$computer"
        $objUser = $objComputer.Create('user', $username)
        $objUser.SetPassword($password)
        $objUser.PSBase.InvokeSet("Description", $description)
        $objUser.PSBase.InvokeSet('userflags', 65536)
        $objUser.SetInfo();
        # set password not to expire
        #wmic USERACCOUNT WHERE "Name = '$username'" SET Passwordexpires=FALSE

        # Add to groups
        $group = [ADSI]"WinNT://./Power Users,group"
        $group.Add("WinNT://$username,user")
        $group = [ADSI]"WinNT://./WW_Users,group"
        $group.Add("WinNT://$username,user")

        $ou = [adsi]"WinNT://127.0.0.1"
        $user = $ou.psbase.get_children().find($username)
        $user.PSBase.InvokeSet("TerminalServicesInitialProgram", "C:\Program Files (x86)\Wonderware\InTouch\view.exe c:\program files (x86)\archestra\framework\bin\sibanyegold-kdce_app_tse1_test")
        $user.PSBase.InvokeSet("MaxConnectionTime", 120)
        $user.PSBase.InvokeSet("MaxDisconnectionTime", 1)
        $user.PSBase.InvokeSet("MaxIdleTime", 30)
        $user.PSBase.InvokeSet("BrokenConnectionAction", 1)
        $user.PSBase.InvokeSet("ReconnectionAction", 1)
        $user.PSBase.InvokeSet("FullName", $fullname)
        $user.setinfo()
    }

Upvotes: 2

fufaeff
fufaeff

Reputation: 46

I found a solution here.

$ou = [adsi]"WinNT://127.0.0.1"
$user = $ou.psbase.get_children().find("test")
$user.PSBase.InvokeSet("TerminalServicesInitialProgram", "C:\logoff.bat")
$user.setinfo()

Upvotes: 3

Related Questions