Wednesday, November 16, 2011

New Look coming to Experts Exchange

As you all know, I try and contribute to Experts Exchange when I can. I am excited for their new look and layout coming in the next month or so! Keep an eye out for more of my posts and articles.


Small Experts Exchange VIP Badge

Wednesday, October 12, 2011

General Failure clicking on URL in Outlook when using Firefox

I use Outlook for my email and Firefox for my default browser. If you are like me, you get lots and lots of emails with links to websites in your email. An annoyance that has been plaguing me for several years now is that when I click on a link in Outlook, I get a message that says, "General Failure. The URL was: ...." and it tells me where I wanted to go. In the past, the URL always opened anyway so I just clicked OK on the message and went about my business.



However, with the upgrade to Outlook 2010 and more importantly Firefox 7.0.1 I get the message but the URL will not open, leaving me with a great big frowny face and no webpage to browse.

Here is an example of what I would get if I tried to open a link in an email from one of my favorite emails, Think Geek:

If this were the end of the story, I would not be posting this. If you too have a frowny face from frustration, simply follow the steps below to not only get the webpage to open, but to also get rid of the message all together.


  1. Close Firefox and Outlook (make sure they are completely closed, i.e. downloads window, popups, etc)
  2. Open Regedit by clicking on Start -> Run -> Regedit
    1. In Vista or Windows 7 you can click Start and type in Regedit in the search area. Make sure you right click and open "As Administrator"
  3. ***WARNING*** Changing keys in the registry can mess up your system. Please make sure you are comfortable using regedit and follow the steps EXACTLY!!
    1. Back up your registry by going to File -> Export
    2. You can back up the whole registry, or browse to the key we are going to change and just back it up. Either way, make sure you have a backup in case you need to revert back.
  4. Browse to HKEY_Classes_Root\FirefoxURL\Shell\Open\ddeexec
    1. You should see a key named Default with a value data of  "%1",,0,0,,,,
    2. Double click it to edit the value data
    3. Clear the value data so that it is blank
    4. Click OK
    5. Close Regedit
    6. Open Outlook and now when you click on an embedded URL not only will you not see the message, but FF will open automatically.

Saturday, April 9, 2011

Setting up SQL 2005 with and External IP

Setting up SQL to use an external IP can give you flexability to access a database without opening up a VPN tunnel or full fledged RDP session.

***WARNING***
This will open up ports in your firewall. You will want to take precautionary steps to be sure that you are not making your network and/or server vulnerable to attack. I will show you a few ways you can protect yourself when using this method.

There are several steps and/or checks to make sure are set.

Here's how to do it:


Open SQL Server Management Studio. Right click on the server and select Properties. This will show you the IP your SQL Server is using.








Open SQL Server Configuration Manager. Expand the SQL Server 2005 Network Configuration menu and highlight the "Protocols for MSSQLSERVER". Make sure that TCP/IP is enabled.






Right click on the "TCP/IP" and select Properties.






Click on the "IP Addresses" Tab.
You should see 3  different entries: IP1, IP2, and IPAll. Usually IP1 will be your external IP, IP2 will be your internal IP.

You can specify the external IP here. I have chosen the IP 198.113.113.113 (not a real IP) I will use the IP in later steps.
You can also specify the port that will be used. I will use the default port of 1433 for this example.

*TIP: Use a custom port to help with security.








Next, open the Surface Area Configuration and click on MSSQLSERVER, expand the Database Engine, and click on Remote Connections. Make sure that the "Local and remote connections" option is selected. In the submenu, you can select either "Using TCP/IP only" or "Using both TCP/IP and named pipes"







Open the Services by going to Start-> All Programs -> Administrative Tools -> Services
Make sure that SQL Server and SQL Browser services are started and are set to start automatically.







Now I need to configure my firewall to allow the connection. I am using a Netgear FVX358.

Click on "Security" and then on "Services"

I will add a service and name it "Real Data Plus". I will make it a TCP type and since I only want to open one port, I will make the "Starting Port" and "Ending Port" the same, the default 1433.








Now, I navigate to the "Firewall" menu, still under the "Security" settings.
Click on the "LAN WAN Rules" tab. Under the "Outbound policy" add a new entry. Be sure to name it the same as the Rule in the above step, in my case "Real Data Plus". Enter the internal address you want the traffic to be redirected to and the external ip the traffic will be coming from.
*TIP: For added security, specify the IP address or range that the traffic will be coming from. The firewall will block all others.








To test to make sure a connection can be made through the external IP open a command prompt and type the following command without the quotes: "sqlcmd -S 198.113.113.113,1433 -U sa" (Of course, use your own IP and port number) You will prompted for a password. Once you enter it, if you get the 1> prompt, you have successfully been connected. Type "EXIT". If you do not get this prompt, you are not able to be connected so something is not opened properly.







To test the port forwarding through the firewall, I used the website http://yougetsignal.com/tools/open-ports I entered the external address of 198.113.113.113 and the port 1433 and it came back to tell me that my port is opened or closed. This is useful, as then you know if it is a SQL problem or a firewall problem.

Tuesday, January 4, 2011

How to use Terminal Server Licenses after a server crash

Recently I had the bad misfortune of having one of my servers that was acting as a terminal server crash. The server is running the Server 2003 OS. When I rebuilt the server all went well until I went to install the licenses. I have a 20 pack of Licenses bought as a retail pack.

When I entered the license key I received the message, Error: Already Activated.

I called Microsoft tech support and was transfered, lost the call, called back, was asked what the server ID was, was told I would have to call another number to have someone walk me through finding the ServerID and then call back. Called the new number but they were not open (apparently not a 24-hour service), tried calling back and again lost the call. Tried one more time and again lost the call.

By now, I am frustrated to say the least! I decided to spend my time Googling the problem instead of calling 800 numbers all night. I found a solution that is SO much easier than trying to understand and communicate with outsourced tech support.

I give credit to this website (http://kbalertz.com/953918/Terminal-Services-license-server-another-Windows-Server-Windows-Server.aspx) that guided me through most of the necessary steps, which I will outline below.

First, go to the Server and click on Start -> All Programs -> Administrative Tools -> Terminal Server Licensing












If your server does not show up but you have added the role, you may see a message like this:



Click on Action -> Connect



Then enter in the name of the Terminal Service Server. If you don't know the name of your server, you can find it by clicking on Start -> All Programs -> Administrative Tools -> Terminal Server Manager



Right Click on the server name and select Properties.


On the first tab (Installation Method) change your Installation Method to Telephone. Select the country and then click OK.



Now right click on the server name again and choose Install Licenses.



The Terminal Server CAL Installation Wizard will come up. Click Next.



You will see the License Server ID here. Make a note of it. You will need this number when you call Microsoft or go to the activation website, as I did. Leave this window open, as you will need to enter in the new license key here.


Now that you have the License Server ID, open a web browser and go to https://activate.microsoft.com/

On the first page, select Manage CALS and click Next.



On the second page, enter in the License Server ID you obtained above. If you know the old License Server ID, you can enter it here as well. Since my server crashed, I did not know the old ID so I left those fields blank.
I chose the reason for recovery as redeployment and retail purchase for the License Program.
Click Next.


On the next page you will be asked to enter in the License Key as well as information about the License Keys and who they were sold to. Enter in the information and click Next. You will be given a new License Key. Be sure to print the page and/or jot down the new key.

Now, enter the new key into the Cal Installation Wizard screen. The wizard will try and activate the license and when successful you will be congratulated.

Now if you go to Start -> All Programs -> Administrative Tools -> Terminal Service Licensing you will see your licenses.



Reusing Terminal Server Licenses on a new server

Sunday, January 17, 2010

Searching SQL Database for Keyword

If you want to search an SQL data base (specifically SQL 2005) for a Keyword, use the following code changing KEYWORD to the term you are searching for:

SELECT ROUTINE_NAME, ROUTINE_DEFINITION
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_DEFINITION LIKE '%KEYWORD%'
AND ROUTINE_TYPE='PROCEDURE'
ORDER BY ROUTINE_NAME

SELECT ROUTINE_NAME, ROUTINE_DEFINITION
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_DEFINITION LIKE '%KEYWORD%'
AND ROUTINE_TYPE='FUNCTION'
ORDER BY ROUTINE_NAME

SELECT NAME
FROM sysobjects
WHERE id IN ( SELECT id FROM syscolumns WHERE NAME like '%KEYWORD%' )

Friday, February 8, 2008

Creating a system DSN entry with VB.Net 2005

I needed to create a ODBC driver that will attach to the database I need to access for my program. The goal is to do as little manually as possible, which means I need to write code to create this ODBC driver.

First of all, many thanks to Paul Clement whose post was able to get my last bug out and the code working correctly. (See his post at http://www.mcse.ms/message1068199.html)

Here is my code:



Private Declare Function SQLConfigDataSource Lib "ODBCCP32.DLL" (ByVal hwndParent As Integer, ByVal ByValfRequest As Integer, ByVal lpszDriver As String, ByVal lpszAttributes As String) As Integer


Private Const ODBC_ADD_SYS_DSN As Short = 4


Private Const vbAPINull As Int32 = 0



Public Function CreateODBC(ByVal szDSNName As String, ByVal szServerName As String, ByVal szDatabase As String) As Boolean


Dim szAttributes As String = ""


Dim szDriver As String = "SQL Server" '//Set to SQL Server as it is the most common


Dim lReturnValue As Int32 = 0



Try


szAttributes = szAttributes & "Server=" & szServerName & Chr(0)


szAttributes = szAttributes & "DESCRIPTION=Test" & Chr(0)


szAttributes = szAttributes & "DSN=" & szDSNName & Chr(0)



szAttributes = szAttributes & "Database=" & szDatabase & Chr(0)


szAttributes = szAttributes & "Trusted_connection=YES" & Chr(0)



'//To show dialog, use Form1.Hwnd instead of vbAPINull


lReturnValue = SQLConfigDataSource(vbAPINull, ODBC_ADD_SYS_DSN, szDriver, szAttributes)



If lReturnValue <> 0 Then


Return True


Else


Return False


End If


Catch ex As Exception


RptError("Unable to create the ODBC", ex)


Return False


End Try


End Function


Tuesday, February 5, 2008

Simple Progress Bar vb.net Code

Here is a simple sample of using a progress bar in vb.net 2005:

I have a form with a progress bar on it called progBar1, a button called btnUpgrade, and a backgroundworker called bwBackgroundWorker.




Private Sub btnUpgrade_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUpgrade.Click


        Try


            '//Disable the upgrade button


            Me.btnUpgrade.Enabled = False


 


            '//Create a new instance and initialize


            bwBackgroundWorker = New System.ComponentModel.BackgroundWorker


            bwBackgroundWorker.WorkerReportsProgress = True


            bwBackgroundWorker.WorkerSupportsCancellation = True


            bwBackgroundWorker.RunWorkerAsync()


 


        Catch ex As Exception


            RptError("Unable to upgrade!", ex)


        End Try


    End Sub


 


    Private Sub bwBackgroundWorker_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bwBackgroundWorker.DoWork


        '//Just for a test, create a loop


 


        For X As Int32 = 0 To 100


            If bwBackgroundWorker.CancellationPending Then


                Exit For


            End If


 


            bwBackgroundWorker.ReportProgress(X)


            Threading.Thread.Sleep(100)


        Next


    End Sub


 


    '//Update the progress bar


    Private Sub bwBackgroundWorker_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles bwBackgroundWorker.ProgressChanged


        Me.progBar1.Value = e.ProgressPercentage


    End Sub