Advertisement
Guest User

Untitled

a guest
Feb 3rd, 2016
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.14 KB | None | 0 0
  1. [CmdLetBinding()]
  2. Param([Parameter(
  3. Mandatory = $true,
  4. HelpMessage = "The path to a config file. For example: .\Web.config."
  5. )][string]$Path)
  6.  
  7. $ErrorActionPreference = "Stop"
  8.  
  9. Add-Type -AssemblyName System.Configuration
  10. Add-Type -AssemblyName System.Data
  11. Add-Type -AssemblyName System.Data.Entity
  12. Add-Type -AssemblyName System.Web
  13.  
  14. function Test-ConnectionString
  15. {
  16. Param([Parameter(Mandatory = $true)][string]$ConnectionString,
  17. [Parameter(Mandatory = $true)][System.Data.Common.DbProviderFactory]$DbProviderFactory)
  18. $connection = $DbProviderFactory.CreateConnection()
  19. $connection.ConnectionString = $ConnectionString
  20. try
  21. {
  22. $connection.Open()
  23. }
  24. catch [System.Data.Common.DbException]
  25. {
  26. Write-Warning $_.Exception.Message
  27. return $false
  28. }
  29. finally
  30. {
  31. $connection.Close()
  32. }
  33.  
  34. return $true
  35. }
  36.  
  37. function New-DbProviderFactory
  38. {
  39. [OutputType([System.Data.Common.DbProviderFactory])]
  40. Param([Parameter(Mandatory = $true)] [string]$ProviderName)
  41.  
  42. # Special handling for Entity Framework - its factory is not installed by default
  43. if ($ProviderName -eq "System.Data.EntityClient")
  44. {
  45. return [System.Data.EntityClient.EntityProviderFactory]::Instance
  46. }
  47.  
  48. return [System.Data.Common.DbProviderFactories]::GetFactory($ProviderName)
  49. }
  50.  
  51. function Parse-ConnectionString
  52. {
  53. [OutputType([System.Data.Common.DbConnectionStringBuilder])]
  54. Param([Parameter(Mandatory = $true)][string]$ConnectionString,
  55. [Parameter(Mandatory = $true)][System.Data.Common.DbProviderFactory]$DbProviderFactory)
  56. $builder = $DbProviderFactory.CreateConnectionStringBuilder()
  57. $builder.set_ConnectionString($ConnectionString)
  58. return $builder
  59. }
  60.  
  61. function Read-Configuration
  62. {
  63. [OutputType([System.Configuration.Configuration])]
  64. Param([Parameter(Mandatory = $true)][string]$ConfigFilename)
  65. if ($ConfigFileName -match "Web.config")
  66. {
  67. $fileInfo = New-Object System.IO.FileInfo -ArgumentList $ConfigFilename
  68. $directoryMapping = New-Object System.Web.Configuration.VirtualDirectoryMapping -ArgumentList $fileInfo.DirectoryName, $true, $fileInfo.Name
  69. $configMap = New-Object System.Web.Configuration.WebConfigurationFileMap
  70. $configMap.VirtualDirectories.Add("/", $directoryMapping)
  71. return [System.Web.Configuration.WebConfigurationManager]::OpenMappedWebConfiguration($configMap, "/")
  72. }
  73. else
  74. {
  75. $configMap = New-Object System.Configuration.ExeConfigurationFileMap
  76. $configMap.ExeConfigFilename = $ConfigFilename
  77. return [System.Configuration.ConfigurationManager]::OpenMappedExeConfiguration($configMap, [System.Configuration.ConfigurationUserLevel]::None)
  78. }
  79. }
  80.  
  81. $step = 1
  82. $config = Read-Configuration -ConfigFilename (Convert-Path $Path)
  83. foreach ($cs in $config.ConnectionStrings.ConnectionStrings)
  84. {
  85. $factory = New-DbProviderFactory -ProviderName $cs.ProviderName
  86. $builder = Parse-ConnectionString -ConnectionString $cs.ConnectionString -DbProviderFactory $factory
  87.  
  88. # Special handling for Entity Framework (nested connetion strings) (YUCK)
  89. if ($builder -is [System.Data.EntityClient.EntityConnectionStringBuilder])
  90. {
  91. $isEntityFramework = $true
  92. $entityfactory = $factory
  93. $entityBuilder = $builder
  94. $factory = New-DbProviderFactory -ProviderName $builder.Provider
  95. $builder = Parse-ConnectionString -ConnectionString $builder.ProviderConnectionString -DbProviderFactory $factory
  96. }
  97. else
  98. {
  99. $isEntityFramework = $false
  100. }
  101.  
  102. # Skip connection strings that use Windows Authentication (Integrated Security is SSPI -or- true -or- yes)
  103. $integrated = $builder.'integrated security'
  104. if ($integrated -match 'SSPI' -or $integrated -match 'true' -or $integrated -match 'yes')
  105. {
  106. continue
  107. }
  108.  
  109. $name = $cs.Name
  110. $server = $builder.DataSource
  111. $database = $builder.InitialCatalog
  112. $user = $builder.UserID
  113. while (!(Test-ConnectionString -ConnectionString $builder.ConnectionString -DbProviderFactory $factory))
  114. {
  115. $user = $builder.UserID
  116. Write-Warning "$step : ($name) Login failed! User ID: '$user', Database: '$database', Server: '$server'"
  117. $credential = Get-Credential -UserName $builder.'User ID' -Message "$step : Please enter database credentials for '$name' (Database: '$database', Server: '$server')"
  118. if ($credential -eq $null)
  119. {
  120. break
  121. }
  122.  
  123. $credential = $credential.GetNetworkCredential()
  124. $builder.'User ID' = $credential.UserName
  125. $builder.Password = $credential.Password
  126. }
  127.  
  128. if (Test-ConnectionString -ConnectionString $builder.ConnectionString -DbProviderFactory $factory)
  129. {
  130. Write-Host "$step : ($name) Successfully logged in! User ID: '$user', Database: '$database', Server: '$server'"
  131.  
  132. # Special handling for Entity Framework (nested connetion strings) (YUCK)
  133. if ($isEntityFramework)
  134. {
  135. $entityBuilder.'provider connection string' = $builder.ConnectionString
  136. $builder = $entityBuilder
  137. }
  138.  
  139. $cs.ConnectionString = $builder.ConnectionString
  140. }
  141.  
  142. $step += 1
  143. }
  144.  
  145. $config.Save()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement