Question: I am creating a Visual Studio 2008 Setup Wizard for my program  

<http://support.microsoft.com/kb/307353>  

I see that it is possible to add registry entries, etc..
Is there a possibility to register windows environment variable without writing a custom action?  

And if I must write a custom action, what is the least painful way to do so?

Answer: 
> 
> ***Warning***: **`Please do not use this approach`**. It is dangerous. Use built-in MSI features for environment variable update.
> 
> 
> ***Example***: Writing straight to **`HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment`** - **`Path`** will wipe out whatever is already there. Very serious.
> 
> 
> ***Solution***: MSI features the [Environment table](https://stackoverflow.com/a/8560425/129130) to facilitate merging and updating of environment variables in a reliable fashion. Note that this table is also known to be complex enough to trigger unexpected results. Please test well. Uninstall scenarios especially.
> 
> 
> 

---

Using Visual Studio 2008, you can easily do it by setting the appropriate variable in the Windows registry:

1. In the Solution Explorer, right-click on your project (not solution), and select **View->Registry**
2. Create the registry key(folder):
	1. For a **User** variable: Right-click on **HKEY\_CURRENT\_USER**, select "**New Key**", and name it "**Environment**".
	2. For a **System** variable: Right-Click on **HKEY\_LOCAL\_MACHINE**, select "**New Key**", and name it "**SYSTEM**". Continue doing this to create the path "**HKEY\_LOCAL\_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment**" .
3. Right-click on the **Environment** key(folder), select **New->String**, and give it the name you want.
4. With the string selected, find the **Properties** window (Alt+Enter will bring it up)
5. In the Properties window, fill in the **Value** you want.

If you want the Value to reference the installation directory, you can do it like this using property variables: [TARGETDIR]SomeFile.ext (see <http://msdn.microsoft.com/en-us/library/aa370905%28v=vs.85%29.aspx> for more property variables)
Ickydime (see answers above) custom action sample shows how to add an environment variable by expanding the PATH env variable. I'm sharing below how to create a new environment variable using `Environment.SetEnvironmentVariable`

```
    string environmentKey = "MY_VAR";
    string pathUrl = "%ProgramFiles%\\...";
    public Installer1()
    {
        InitializeComponent();
    }

    [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)]
    public override void Install(IDictionary stateSaver)
    {
        base.Install(stateSaver);
    }

    [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)]
    public override void Commit(IDictionary savedState)
    {
        base.Commit(savedState);
        Environment.SetEnvironmentVariable(environmentKey, pathUrl, EnvironmentVariableTarget.Machine);
    }

    [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)]
    public override void Rollback(IDictionary savedState)
    {
        base.Rollback(savedState);
    }

    [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)]
    public override void Uninstall(IDictionary savedState)
    {
        base.Uninstall(savedState);
        Environment.SetEnvironmentVariable(environmentKey, null, EnvironmentVariableTarget.Machine);
    }

```