A VS.NET Macro to Generate Machine Keys.
I needed to create a new machine key for an asp.net site. I found a couple of command line utils out on the web that would create a new key but I thought it would be easier to just have it avail in VS.NET. So, I threw together this little macro that will generate the machine key and insert it. Just run the macro while you have you web.config open in VS.NET. If you already have a machinekey it will find it and replace it. If not it will just add it right after the <system.web> node. It should do the proper indents and everything too.
1: Imports System
2: Imports EnvDTE
3: Imports EnvDTE80
4: Imports System.Diagnostics
5: 6: Public Module AspNetUtils
7: 8: #Region "Helper Code"
9: 10: Dim _rng As New System.Security.Cryptography.RNGCryptoServiceProvider()
11: 12: Private Function GetRandomData(ByVal size As Integer) As Byte()
13: Dim randomData(size) As Byte
14: _rng.GetBytes(randomData)15: Return randomData
16: End Function
17: 18: Private Function ToHex(ByVal data() As Byte) As String
19: Dim sb As New System.Text.StringBuilder()
20: For i As Integer = 0 To data.Length - 1
21: sb.AppendFormat("{0:X2}", data(i))
22: Next
23: Return sb.ToString()
24: End Function
25: 26: Private Sub WriteNewMachineKey(ByVal sel As TextSelection)
27: sel.Insert("<machineKey")
28: sel.NewLine()29: sel.Insert(String.Format("validationKey='{0}'", ToHex(GetRandomData(63))))
30: sel.NewLine()31: sel.Insert(String.Format("decryptionKey='{0}'", ToHex(GetRandomData(23))))
32: sel.NewLine()33: sel.Insert("decryption='SHA1'")
34: sel.NewLine()35: sel.Insert("/>", vsInsertFlags.vsInsertFlagsContainNewText)
36: sel.Unindent() 37: sel.Collapse()38: End Sub
39: 40: #End Region
41: 42: #Region "Macros"
43: 44: Public Sub GenerateMachineKey()
45: If Not DTE.ActiveDocument Is Nothing AndAlso DTE.ActiveDocument.Name.ToLower() = "web.config" Then
46: Dim sel As TextSelection = DTE.ActiveDocument.Selection
47: 48: If sel.FindPattern("\<machineKey((:b|\n)*:i=:q)*(:b|\n)*/\>", vsFindOptions.vsFindOptionsFromStart Or vsFindOptions.vsFindOptionsMatchInHiddenText Or vsFindOptions.vsFindOptionsRegularExpression) Then
49: ' Replace an existing <machineKey /> element
50: sel.Delete() 51: WriteNewMachineKey(sel)52: ElseIf sel.FindText("<system.web>", vsFindOptions.vsFindOptionsFromStart Or vsFindOptions.vsFindOptionsMatchInHiddenText) Then
53: ' insert the new machineKey just after the <system.web> element
54: sel.Collapse() 55: sel.NewLine() 56: WriteNewMachineKey(sel)57: Else
58: ' no <system.web> element found so just collapse the current selection and insert
59: ' the new key at the cursor location
60: sel.Collapse() 61: WriteNewMachineKey(sel)62: End If
63: End If
64: End Sub
65: 66: #End Region
67: 68: End Module