Page 1 of 2 12 LastLast
Results 1 to 15 of 17
  1. #1
    Administrator Rick Corbett's Avatar
    Join Date
    Dec 2009
    Location
    South Glos., UK
    Posts
    3,281
    Thanks
    150
    Thanked 875 Times in 709 Posts

    Couple of PowerShell links

    Here's a couple of links I stumbled across. Perhaps they may be useful to others:

    Find the product GUID of installed software with PowerShell

    How to create an open file/folder dialog box with PowerShell

  2. #2
    Super Moderator RetiredGeek's Avatar
    Join Date
    Mar 2004
    Location
    Manning, South Carolina
    Posts
    9,937
    Thanks
    418
    Thanked 1,592 Times in 1,444 Posts
    Rick,

    Here's the first article's code cleaned up a bit.
    Code:
    Clear-Host
    
    $GUIDCaption = 'GUID - Globally Unique Identifier'
    $fmtGUID = @{Name=$GUIDCaption ;Expression={$_.PSChildName}}, 
               @{Name='ProgramName';
                 Expression={$_.GetValue('DisplayName')}}
    
    $PSDArgs = @{Name        = 'HKU'
                 PSProvider  = 'Registry' 
                 Root        = 'Registry::HKEY_USERS' 
                 ErrorAction = 'SilentlyContinue'}
    $null = New-PSDrive @PSDArgs
    
    $UninstallKeys += 
       Get-ChildItem HKU: -ErrorAction SilentlyContinue | 
       Where-Object { $_.Name -match 'S-\d-\d+-(\d+-){1,14}\d+$' } | 
       ForEach-Object { "HKU:\$($_.PSChildName)\Software\Microsoft\" +
                        "Windows\CurrentVersion\Uninstall" }
    
    foreach ($UninstallKey in $UninstallKeys) {
        $GCIArgs = @{Path = $UninstallKey
                     ErrorAction = 'SilentlyContinue'}
        Get-ChildItem @GCIArgs | 
        Where {$_.PSChildName -match 
              '^{[A-Z0-9]{8}-([A-Z0-9]{4}-){3}[A-Z0-9]{12}}$'} | 
        Format-Table -Property $fmtGUID -wrap
    }
    HTH
    May the Forces of good computing be with you!

    RG

    PowerShell & VBA Rule!

    My Systems: Desktop Specs
    Laptop Specs

  3. #3
    Administrator Rick Corbett's Avatar
    Join Date
    Dec 2009
    Location
    South Glos., UK
    Posts
    3,281
    Thanks
    150
    Thanked 875 Times in 709 Posts
    RG - I have the first article's code working (using a wildcard to show all software identified by just a GUID) but - sorry - I can't get yours to work. I get an error "Missing closing '}' in statement block or type definition" but I'm blowed if I can see where it's missing from.

    I notice that there's no mention of HKLM so it looks like it only iterates through HKCU... so I may have pasted it incorrectly.

    Could you attach as a .ps1 file so I can check that it's not my copy/pasting at fault?

    Many thanks.

    PS - Phew, hit wrong button and almost closed Firefox... and its 583 open tabs. ROFL
    ff-quantum-583-tabs.jpg

  4. #4
    Super Moderator RetiredGeek's Avatar
    Join Date
    Mar 2004
    Location
    Manning, South Carolina
    Posts
    9,937
    Thanks
    418
    Thanked 1,592 Times in 1,444 Posts
    Rick,

    Here's the .ps1 file: Get-GUIDs.zip

    Note: I tried changing the $PSDARGS Name parameter from HKU to HKLM and ran the program. I copied both results into Notepad++ and ran a compare and they were identical?

    HTH
    May the Forces of good computing be with you!

    RG

    PowerShell & VBA Rule!

    My Systems: Desktop Specs
    Laptop Specs

  5. #5
    Administrator Rick Corbett's Avatar
    Join Date
    Dec 2009
    Location
    South Glos., UK
    Posts
    3,281
    Thanks
    150
    Thanked 875 Times in 709 Posts
    OK, I must be doing something wrong then. I opened Get-GUIDs.ps1 (thank you) in Windows PowerShell ISE (x86) (running as elevated) and ran it without error. There was a flash in the lower pane but no output. From what I can work out, I should have seen the results formatted as a table within the (lower) output pane... but nada.

    Yet if I run the following (i.e. the article code, with a single amendment to use a wildcard) I see the results I expect.

    Code:
    Get-InstalledSoftware -Name '*'
    function Get-InstalledSoftware {
        [OutputType([System.Management.Automation.PSObject])]
        [CmdletBinding()]
        param (
            [Parameter()]
            [ValidateNotNullOrEmpty()]
            [string]$Name
        )
     
        $UninstallKeys = "HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall", "HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall"
        $null = New-PSDrive -Name HKU -PSProvider Registry -Root Registry::HKEY_USERS
        $UninstallKeys += Get-ChildItem HKU: -ErrorAction SilentlyContinue | Where-Object { $_.Name -match 'S-\d-\d+-(\d+-){1,14}\d+$' } | ForEach-Object { "HKU:\$($_.PSChildName)\Software\Microsoft\Windows\CurrentVersion\Uninstall" }
        if (-not $UninstallKeys) {
            Write-Verbose -Message 'No software registry keys found'
        } else {
            foreach ($UninstallKey in $UninstallKeys) {
                if ($PSBoundParameters.ContainsKey('Name')) {
                    $WhereBlock = { ($_.PSChildName -match '^{[A-Z0-9]{8}-([A-Z0-9]{4}-){3}[A-Z0-9]{12}}$') -and ($_.GetValue('DisplayName') -like "$Name*") }
                } else {
                    $WhereBlock = { ($_.PSChildName -match '^{[A-Z0-9]{8}-([A-Z0-9]{4}-){3}[A-Z0-9]{12}}$') -and ($_.GetValue('DisplayName')) }
                }
                $gciParams = @{
                    Path        = $UninstallKey
                    ErrorAction = 'SilentlyContinue'
                }
                $selectProperties = @(
                    @{n='GUID'; e={$_.PSChildName}}, 
                    @{n='Name'; e={$_.GetValue('DisplayName')}}
                )
                Get-ChildItem @gciParams | Where $WhereBlock | Select-Object -Property $selectProperties
            }
        }
    }
    PS - I understand the code a bit more after reading Using PowerShell providers. I don't use PowerShell enough to have run into this concept and usage before.
    Last edited by Rick Corbett; 2018-06-25 at 20:41.

  6. #6
    Super Moderator RetiredGeek's Avatar
    Join Date
    Mar 2004
    Location
    Manning, South Carolina
    Posts
    9,937
    Thanks
    418
    Thanked 1,592 Times in 1,444 Posts
    Rick,

    May I ask why you're using the x86 (32 bit) version? I've been testing on the 64 bit version and it works fine.

    Well it seems that it doesn't work on the 32 bit version because I deleted this:
    Code:
      $UninstallKeys = 
        "HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall", 
        "HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\" +
        "CurrentVersion\Uninstall"
    It doesn't like that $ninstallKeys is NOT initialized when referenced later in the code. However, the 64 bit version did not complain and I got the same results:
    Code:
    PS> $UninstallKeys
    HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall
    HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\
    CurrentVersion\Uninstall
    HKU:\S-1-5-21-1944453205-1635450679-2182824496-1001\Software\Microsoft\Windows\C
    urrentVersion\Uninstall
    HKU:\S-1-5-21-1944453205-1635450679-2182824496-1001\Software\Microsoft\Windows\C
    urrentVersion\Uninstall
    So here's the code with the code added back and the Function, which I missed by not reading all the way down, updated a bit and expanded the comment based help. I've also made both of them sort by Program name.

    Function - Get-InstalledSoftware.zip

    Please note that I checked the output against my PCInfo PS program and this method does NOT show all installed software!
    Ex: Avidemux 2.7 - 64 bits.
    Outlook Google Calendar Sync
    Macrium Reflect

    You also get different lists if you use PS 64 vs PS 32!

    HTH
    May the Forces of good computing be with you!

    RG

    PowerShell & VBA Rule!

    My Systems: Desktop Specs
    Laptop Specs

  7. #7
    Administrator Rick Corbett's Avatar
    Join Date
    Dec 2009
    Location
    South Glos., UK
    Posts
    3,281
    Thanks
    150
    Thanked 875 Times in 709 Posts
    Quote Originally Posted by RetiredGeek
    May I ask why you're using the x86 (32 bit) version? I've been testing on the 64 bit version and it works fine.
    'Cos I don't have a clue what I'm doing?

    (It's 'cos I usually use AutoHotkey which, like MS Office, advises the use of the x32 version instead of x64, even in an x64 environment. So I just thought...)

    Quote Originally Posted by RetiredGeek
    So here's the code with the code added back and the Function, which I missed by not reading all the way down, updated a bit and expanded the comment based help. I've also made both of them sort by Program name.
    Yay! All working... thank you.

    Quote Originally Posted by RetiredGeek
    Please note that I checked the output against my PCInfo PS program and this method does NOT show all installed software!
    Ex: Avidemux 2.7 - 64 bits.
    Outlook Google Calendar Sync
    Macrium Reflect
    That's OK... I'm only looking at identifying obfuscated MS software to remove from an 1803 VM to try to make it more responsive.

    Ever seen this padlock before? It now appears after each boot or sign out/sign in and disappears after several seconds.
    padlock in systray.jpg

    EDIT: Hmm... even though you can't use GPEDIT in Win 10 Home, if you disable the Group Policy Client service you get this padlock. Who'd a thunk it? Have now re-enabled it but set it as Manual, not Automatic... and problem solved.
    Last edited by Rick Corbett; 2018-06-25 at 21:55.

  8. #8
    Super Moderator RetiredGeek's Avatar
    Join Date
    Mar 2004
    Location
    Manning, South Carolina
    Posts
    9,937
    Thanks
    418
    Thanked 1,592 Times in 1,444 Posts
    Rick,

    You might want to try my PCInfo program. I've never run it inside a VM!

    CMsLocalPCInfo.ps1 CMsLocalPCInfo.zip

    Run PowerShell as Admin then load and run program. Check out the Installed Program tab.

    HTH
    May the Forces of good computing be with you!

    RG

    PowerShell & VBA Rule!

    My Systems: Desktop Specs
    Laptop Specs

  9. #9
    Administrator Rick Corbett's Avatar
    Join Date
    Dec 2009
    Location
    South Glos., UK
    Posts
    3,281
    Thanks
    150
    Thanked 875 Times in 709 Posts
    Quote Originally Posted by RetiredGeek
    You might want to try my PCInfo program. I've never run it inside a VM!
    Wow! Your script has come a long way since I last looked at it. It works absolutely fine in a VM (except for not identifying any RAM info).

    I looked through your code and couldn't work out how you managed to get it to remain at the top of the Windows z-order? I know how to do it with AutoHotkey but didn't know it was possible with PS... or is this just a quirk of PS?

    Let me know if you want any feedback. It's obviously a labour of love... I don't think I've ever written a program of even 300 lines, let alone over 3000!

    Quote Originally Posted by RetiredGeek
    Check out the Installed Program tab.
    I see what you mean... Foxit Reader shows up in your script, which it doesn't when using the 'Find the product GUID...' code. Hmm... it took me a while to realise that your script iterates through SOFTWARE\WOW6432Node...Uninstall as well as SOFTWARE\...Uninstall.

    I hadn't considered before how prescriptive you have to be... I had assumed that Windows would consider both locations and look in both automatically. I should however have realised much sooner... 'cos I'm used to redirecting registry calls in AHK. That's why you're the geek and I'm just a tinkerer!

    PS - Line 32... I suspect Stephen Owen turned you on to XAML rather than the '80's all-female German gothic rock group... but I could be wrong. ROFL

  10. #10
    Super Moderator RetiredGeek's Avatar
    Join Date
    Mar 2004
    Location
    Manning, South Carolina
    Posts
    9,937
    Thanks
    418
    Thanked 1,592 Times in 1,444 Posts
    Rick,

    I looked through your code and couldn't work out how you managed to get it to remain at the top of the Windows z-order? I know how to do it with AutoHotkey but didn't know it was possible with PS... or is this just a quirk of PS?
    Code:
    $Window.Topmost = $True
    PS - Line 32... I suspect Stephen Owen turned you on to XAML rather than the '80's all-female German gothic rock group
    Dyslexia in action!
    ROTFLOL.gif

    HTH
    May the Forces of good computing be with you!

    RG

    PowerShell & VBA Rule!

    My Systems: Desktop Specs
    Laptop Specs

  11. #11
    Administrator Rick Corbett's Avatar
    Join Date
    Dec 2009
    Location
    South Glos., UK
    Posts
    3,281
    Thanks
    150
    Thanked 875 Times in 709 Posts
    Quote Originally Posted by RetiredGeek
    Code:
    $Window.Topmost = $True
    I missed that. Thank you.

    Perhaps remove the call for WinRM now your script is just for local information?

    Perhaps consider reporting the status of the main telemetry service, 'Connected User Experience and Telemetry' (diagtrack)? (i.e. running/stopped and Start status e.g. disabled):
    Code:
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\DiagTrack\Start
    Under Networking, perhaps consider reporting the status of SMB1, i.e. is it installed and, if so, is it enabled?

    For example...
    Code:
    #Is the SMB1 Feature installed (2012/2016)
    Get-WindowsFeature -Name FS-SMB1
    Code:
    #Is the SMB1 Protocol Enabled (2008)
    Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" -Name SMB1 | Select SMB1
    Also, perhaps consider reporting the local IP, subnet and mask (in case an APIPA address has been assigned)?

    Consider reporting the WAN IP by querying a remote resource (to show if the internet is available)?

    Consider reporting 'Preferred DNS'?

    Consider reporting whether IPv6 has been disabled? (I've seen advice online to do this... but, amongst other things, it's needed for Homegroups.)

    On the Network tab there's an entry for Network Computers but this shows no results, even though the VM is part of a network and can see other computers.

    Consider reporting the 'Interface metric' order of ethernet and wifi adapters (using get-netipinterface). This can help determine why a device chooses wifi over ethernet.

    Consider reporting whether network is public or private?

    Consider reporting the status of both Homegroup services.

    Consider reporting whether Homegroup sharing is enabled:
    Code:
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\HomeGroup\SharingInProgress, SharingInProgress
    Consider reporting the status of the following services (as 1803 has introduced discovery/sharing issues):
    Computer Browser (Browser)
    Function Discovery Provider Host (FDPHost)
    Function Discovery Resource Publication (FDResPub)
    Network Connections (NetMan)
    UPnP Device Host (UPnPHost)
    Peer Name Resolution Protocol (PNRPSvc)
    Peer Networking Grouping (P2PSvc)
    Peer Networking Identity Manager (P2PIMSvc)
    (See https://www.askwoody.com/2018/patch-...-peer-to-peer/)

    On the Windows tab, perhaps consider appending the build info to the Release ID or as a seperate entry?
    I do this by concatenating the following 2 reg values:
    Code:
    HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\CurrentBuild
    & "." &
    Code:
    HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\UBR
    On the Windows tab, maybe obfuscate all but the last 5 characters of the OEM/User Key (perhaps with a message along the lines of "Info partially hidden for security")?

    On the Windows tab, under Shell Folder Name, it reports an entry of {F42EE2D3-909F-4907-8871-4C22FC0BF756}. Should this not be displayed as My Documents?

    On the Windows tab, the 'AV State' shows as a number (my VM shows 401680) with no explanation what the number means?

    On the Windows tab, consider reporting the state of WUASERV, e.g. whether running or stopped plus the Start value (as a word, not just as a number)?

    On the Environment tab you show the env location of TEMP/TMP for 'current user'. Consider adding the same for 'System'. (This will show when people (like me) habitually re-direct both env locations to the same place.)

    On the Printer tab, consider reporting on virtual printers, e.g. Foxit and MS Fax. (They appear under printers in Settings so...)

    On the Registry Items tab, consider renaming it to Registry/Services. IMO this makes more sense as, under the Security Items section, you're showing the state of services, not registry values.

    On the Registry Items tab, consider reporting the Start status for the services as well as their running state.

    Consider reporting the status of the main telemetry service, 'Connected User Experience and Telemetry' (diagtrack), i.e. running/stopped and Start status (e.g. disabled):
    Code:
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\DiagTrack\Start
    Consider adding a User info tab and moving the User Account Info from the Windows tab.

    Consider adding the SIDs of each user account (by looping through HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\). (On second thoughts, whilst it was useful just once, I've never needed it again. Hmm...)

    Consider adding/identifying the current logged on user to clarify that the info under Shell Folder Name refers just to current user.

    PS - If you save to file, the first line concatenates 'Information' and 'Version', i.e. a CR/LF is missing.

    Just observations, not criticisms... so, really sorry if feedback was not wanted. Your coding skills are just *way* beyond my own hacks... and, it's a shame but, we seem to be alone here in this sub-forum.
    Last edited by Rick Corbett; 2018-06-26 at 20:57.

  12. #12
    Super Moderator RetiredGeek's Avatar
    Join Date
    Mar 2004
    Location
    Manning, South Carolina
    Posts
    9,937
    Thanks
    418
    Thanked 1,592 Times in 1,444 Posts
    Rick,

    Where do I start? Let's see I'm 68.5 now I might get it done before time's up!
    ROTFLOL.gif

    Consider reporting the status of both Homegroup services.
    It's done on the Registry/Services Tab:
    Code:
    --- Registry/Services ---    
    
    Item                                                         Value               
    ----                                                         -----               
    Registry: HiberbootEnabled                                   False               
    Registry: HibernateEnabled                                   False               
    Service:  Connected User Experiences and Telemetry           Stopped             
    Service:  HomeGroup Listener                                 Stopped             
    Service:  HomeGroup Provider                                 Stopped
    Is the SMB1 Feature installed (2012/2016)
    Covered in my CMsStdSettingsForm.ps1 program (lets you turn it on/off)
    I guess I could put it in here also.

    On the Windows tab, under Shell Folder Name, it reports an entry of {F42EE2D3-909F-4907-8871-4C22FC0BF756}. Should this not be displayed as My Documents?
    Code:
       $ShellFoldLoc = @{}
      
      $Folders = @("My Pictures","My Music","My Video",
                   '{F42EE2D3-909F-4907-8871-4C22FC0BF756}')
      
      ForEach ($Folder in $Folders) {
      
      $GIArgs = @{Path = $("Registry::HKCU\Software\Microsoft\Windows" +
                         "\CurrentVersion\Explorer\User Shell Folders")
                  Name = "$Folder"}
      
      #Place data in Hash Table
      $ShellFoldLoc += @{$Folder = (Get-ItemProperty @GiArgs).$Folder}
      
      }
      
      $fmtShellFolds = 
          @{Expression={$_.Name};
             Label="Shell Folder Name";Width=40},
          @{Expression={$_.Value};
             Label="Shell Folder Location";Width=35}
      
      $ShellFolds = $ShellFoldLoc | 
                    Format-Table -Property $fmtShellFolds 
    
    
    PS>   $ShellFoldLoc = @{}
      
      $Folders = @("My Pictures","My Music","My Video",
                   '{F42EE2D3-909F-4907-8871-4C22FC0BF756}')
      
      ForEach ($Folder in $Folders) {
      
      $GIArgs = @{Path = $("Registry::HKCU\Software\Microsoft\Windows" +
                         "\CurrentVersion\Explorer\User Shell Folders")
                  Name = "$Folder"}
      
      #Place data in Hash Table
      $ShellFoldLoc += @{$Folder = (Get-ItemProperty @GiArgs).$Folder}
      
      }
      
      $fmtShellFolds = 
          @{Expression={$_.Name};
             Label="Shell Folder Name";Width=40},
          @{Expression={$_.Value};
             Label="Shell Folder Location";Width=35}
      
      $ShellFoldLoc | 
                    Format-Table -Property $fmtShellFolds 
     
    
    
    Shell Folder Name                        Shell Folder Location              
    -----------------                        ---------------------              
    My Video                                 G:\BEKDocs\Videos                  
    My Pictures                              G:\BEKDocs\Pictures                
    My Music                                 G:\BEKDocs\Music                   
    {F42EE2D3-909F-4907-8871-4C22FC0BF756}   G:\BEKDocs                         
    
    
    
    PS>   $ShellFoldLoc = @{}
      
      $Folders = @("My Pictures","My Music","My Video",
                   'My Documents')
      
      ForEach ($Folder in $Folders) {
      
      $GIArgs = @{Path = $("Registry::HKCU\Software\Microsoft\Windows" +
                         "\CurrentVersion\Explorer\User Shell Folders")
                  Name = "$Folder"}
      
      #Place data in Hash Table
      $ShellFoldLoc += @{$Folder = (Get-ItemProperty @GiArgs).$Folder}
      
      }
      
      $fmtShellFolds = 
          @{Expression={$_.Name};
             Label="Shell Folder Name";Width=40},
          @{Expression={$_.Value};
             Label="Shell Folder Location";Width=35}
      
      $ShellFoldLoc | 
                    Format-Table -Property $fmtShellFolds 
     
    
    Get-ItemProperty : Property My Documents does not exist at path 
    HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders.
    At line:13 char:33
    +   $ShellFoldLoc += @{$Folder = (Get-ItemProperty @GiArgs).$Folder}
    +                                 ~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidArgument: (My Documents:String) [Get-Item 
       Property], PSArgumentException
        + FullyQualifiedErrorId : System.Management.Automation.PSArgumentException 
       ,Microsoft.PowerShell.Commands.GetItemPropertyCommand
     
    The property 'My Documents' cannot be found on this object. Verify that the 
    property exists.
    At line:13 char:3
    +   $ShellFoldLoc += @{$Folder = (Get-ItemProperty @GiArgs).$Folder}
    +   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : NotSpecified: (:) [], PropertyNotFoundException
        + FullyQualifiedErrorId : PropertyNotFoundStrict
     
    
    Shell Folder Name                        Shell Folder Location              
    -----------------                        ---------------------              
    My Video                                 G:\BEKDocs\Videos                  
    My Pictures                              G:\BEKDocs\Pictures                
    My Music                                 G:\BEKDocs\Music
    As you can see "My Documents" does not work. I also tested "MyDocuments" & "Documents" with the same result.

    Well that's all Folks! Beddy Bye time for Old Men!

    I've copied your post and placed it in my Items to add folder for the program.
    May the Forces of good computing be with you!

    RG

    PowerShell & VBA Rule!

    My Systems: Desktop Specs
    Laptop Specs

  13. #13
    Administrator Rick Corbett's Avatar
    Join Date
    Dec 2009
    Location
    South Glos., UK
    Posts
    3,281
    Thanks
    150
    Thanked 875 Times in 709 Posts
    No pressure! Just didn't want you to get bored. ROFL

    (I'm just a sprightly 63.5... )

  14. #14
    Administrator Rick Corbett's Avatar
    Join Date
    Dec 2009
    Location
    South Glos., UK
    Posts
    3,281
    Thanks
    150
    Thanked 875 Times in 709 Posts
    So... got it all done yet?

    hysterical-big.gif
    Last edited by Rick Corbett; 2018-06-27 at 09:47.

  15. #15
    WS Lounge VIP access-mdb's Avatar
    Join Date
    Dec 2009
    Location
    Oxfordshire, UK
    Posts
    2,024
    Thanks
    162
    Thanked 188 Times in 181 Posts
    3000 lines - add Rick's suggestions, 5000, 6000, 7000, 8000 and counting!
    Shame your attachment is invalid Rick!
    You finished yet RG?
    What do you mean nothing is impossible? I've been doing nothing for years.

Page 1 of 2 12 LastLast

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •