lipkau / PsIni

Work with INI files in PowerShell using hashtables
http://lipkau.github.io/PsIni
MIT License
152 stars 52 forks source link

PsIni doesn't work with C:\ProgramData\Microsoft\Network\Connections\Pbk\rasphone.pbk #57

Open Mike-FUT opened 4 years ago

Mike-FUT commented 4 years ago

Not sure if you consider amending the scripts because the rasphone.pbk is a rather special INI file. The issues are:

When writing the file with Out-IniFile the mentioned wrong elements look like this - the (...) is added by me:

CustomAuthData=System.Collections.ArrayList D88F7E15760070006E002D0066007500740(...) instead of CustomAuthData=D88F7E15760070006E002D006(...)

or

DEVICE=System.Collections.ArrayList vpn DEVICE=vpn instead of Device=WAN Miniport (SSTP) DEVICE=vpn

Since this is a rather special INI file I'm not sure if it is worth looking into but I would be very happy to see it working since modifying the rasphone.pbk file is the only option to change certain settings for VPN connections in Windows.

lipkau commented 4 years ago

please provide the content of the original file

Mike-FUT commented 4 years ago

rasphone.txt

File is attached (renamed to .txt and internal data replaced with dummys).

These are the commands I'm using which basically "destroy" the file:

$iniPath = "C:\ProgramData\Microsoft\Network\Connections\Pbk\rasphone.pbk"
$ini = Get-IniContent $iniPath

$ini["Test-VPN"]["ExcludedProtocols"]="8"
$ini["Test-VPN"]["PreferredHwFlow"]="1"
$ini["Test-VPN"]["PreferredProtocol"]="1"
$ini["Test-VPN"]["PreferredCompression"]="1"
$ini["Test-VPN"]["PreferredSpeaker"]="1"
$ini["Test-VPN"]["IpDnsAddress"]="10.117.1.11"
$ini["Test-VPN"]["IpDns2Address"]="10.117.1.12"
$ini["Test-VPN"]["IpNameAssign"]="2"
$ini["Test-VPN"]["IpNBTFlags"]="0"
$ini["Test-VPN"]["DisableClassBasedDefaultRoute"]="1"
$ini["Test-VPN"]["AutoTiggerCapable"]="1"

$ini | Out-IniFile -FilePath $iniPath -Encoding UTF8 -Force
devio commented 3 years ago

@lipkau The first appearance of the value is overwritten with the arraylist in Get-IniContent. You should rather safe the previous value before creating an arraylist. Fix:

                    if ($ini[$section][$name] -is [string]) {
                        $first = $ini[$section][$name]
                        $ini[$section][$name] = [System.Collections.ArrayList]::new()
                        $ini[$section][$name].Add($first) | Out-Null
                        $ini[$section][$name].Add($value) | Out-Null
                    }

cheers,

Thorsten

PsychoData commented 3 years ago

Just saw that https://github.com/lipkau/PsIni/pull/58 was in here and trying to tackle the Duplicate Key issue. I just submitted https://github.com/lipkau/PsIni/pull/63 before I saw that. Either way, though - in my testing it seemed like I was getting a second key of my "duplicate" and then continuing forward from there with the Arraylist

image

and when written out, it resulted in this annoying double-expansion of the ArrayList image

PsychoData commented 3 years ago

However, like I mentioned here https://github.com/lipkau/PsIni/issues/60#issuecomment-916692207 I think either of mine or @devio 's solutions would also possibly raise an issue of moving entries up/down within a file

so

   key = value
# 'comment line'
# 'comment line'
   key = value
# 'comment line' 

would end up like this I believe


# 'comment line'
# 'comment line'
   key = value
   key = value
# 'comment line' 

or possibly like this for devio's solution - I think - I didn't check his personally

    key = value
    key = value
 # 'comment line'
 # 'comment line'
 # 'comment line' 

To fully allow for duplicate keys, potentially spread through the entire file & assuming their positioning relative to other entries within a section (or lack of a section) is important - I'm not sure how to get around the bunching problem