Wednesday, March 11, 2015

Recovering partition after initializing by mistake

I recently re installed windows, i have 2 drives, i have removed the second drive to keep the data safe.
After the installation i have connected my hard drive. I didn't find the drive appearing in file explorer. When i opened Computer Management-> Disk Management, i received message saying that the drive is not initialized, so i followed the steps to initialize it, thinking that this will restore the drive and the data, then i found that the drive now has the state of un-allocated and the next available options is to create volumes, then i realized that i may have destroyed my data.
Looking online i found some forums talking about something similar and that MiniTool Partition wizard have recovery wizard that can recover the drive
http://www.sevenforums.com/hardware-devices/288692-disk-1-unknown-not-initialized-unallocated.html

I gave it a try, downloaded the free tool from http://www.partitionwizard.com/download.html, then selected the drive, started the recovery wizard, did the quick scan, and voila, the partition was recovered. That was really great tool that saved my data.

Sunday, January 18, 2015

Remote desktop connection: Authentication error has occurred (Code: 0x80004005)

Usually i connect to my other machine without any problems, one time suddenly i was receiving this error:

Authentication error has occurred (Code: 0x80004005)

And here is my experience with it, searching for it found this post saying that it could because of third party software or antivirus. Then i remembered that sometimes when i had fiddler open on my machine, i get authentication errors from outlook and some other clients that are unable to connect with the server on secure connections, i figured out that this could be the reason, that i have fiddler open in my machine and it is blocking the authentication.

So i needed to shut down fiddler on my remote machine, i remember that PsTools allows executing commands on remote machine, Then i found this article on steps to run PsKill to kill process on remote machine.

All i needed to do is:
- Download PsTools, then extract it
- Start command prompt in elevated mode (run as administrator)
- Go to PsTools extracted folder on run the command

pskill.exe \\MachineName -u username -p password Fiddler

Should take some time and come back with

Process Fiddler killed on MachineName

Trying to remote connect to my machine after that, worked as usual.

Wednesday, December 17, 2014

Windows 8 apps opening problem

On my work PC i had this issue, domain account on windows 8, and whenever i tried to open any of windows 8 apps, it is opened and disappears and the window is not displayed.
When i searched i found lots of articles taking about windows apps issues, but all didn't help. I found helpful articles when i searched with the error i found in event viewer like:


Activation of app windows.immersivecontrolpanel_cw5n1h2txyewy!microsoft.windows.immersivecontrolpanel failed with error: This app does not support the contract specified or is not installed. See the Microsoft-Windows-TWinUI/Operational log for additional information.

I found the solution in couple of articles

I can't open any Windows 8 apps including PC Settings and Store
Fix Windows 8.1 Cannot Launch “PC Settings” or “Store” Problem

Running the below commands solved the problem

powershell -ExecutionPolicy Unrestricted Add-AppxPackage -DisableDevelopmentMode -Register $Env:SystemRoot\camera\AppxManifest.xml
powershell -ExecutionPolicy Unrestricted Add-AppxPackage -DisableDevelopmentMode -Register $Env:SystemRoot\FileManager\AppxManifest.xml
powershell -ExecutionPolicy Unrestricted Add-AppxPackage -DisableDevelopmentMode -Register $Env:SystemRoot\ImmersiveControlPanel\AppxManifest.xml

Monday, October 20, 2014

Enabling remote desktop on remote computer

I went home and forgot to enable remote desktop on my PC at my office, luckily i found couple of articles that is talking about enabling remote desktop remotely.

I followed the steps from  here and did a restart for the remote machine, but it didn't work, then i figured that since i did it through registry, firewall rules wasn't updated to allow it, while if i enabled remote desktop connections through the UI, it is updated automatically.

I found another article that has the same steps plus updating the firewall to enable remote desktop connections with a command line that is executed remotely. Another article for opening the firewall for remote desktop connections from command line.

The only thing that i have done extra is that i started the elevated command prompt for "psexec", the normal one didn't do the job.

Brief of the steps:
1- From the registry, connect to the remote computer
2- Change the key HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\fDenyTSConnections from 1 to 0
3- Restart the remote machine by shutdown -m \\MachineName -r
4- Update the firewall rules on the remote machine by downloading psexec and running the below from elevated command prompt
psexec \\remote_machine_name cmd
Then after it connects
netsh advfirewall firewall set rule group=”remote desktop” new enable=Yes

Thursday, June 26, 2014

.NET C#: Running command line in CMD and waiting for it to finish

I had a script that i should call with command line interface, then other tasks that should be done after that.
I used the Process and ProcessStartInfo as below, but the problem i had is that the script was taking some time, and the program execution was failing after that since the script is not finished yet.

            using (Process process = new Process())
            {
                var startInfo = new ProcessStartInfo("cmd")
                {
                    RedirectStandardInput = true,
                    RedirectStandardOutput = true,
                    WindowStyle = ProcessWindowStyle.Normal,
                    UseShellExecute = false,
                    CreateNoWindow = false
                };

                process.StartInfo = startInfo;
                process.OutputDataReceived += (sender, e) => Console.WriteLine(e.Data);
                process.Start();
                process.StandardInput.Write("script"+ process.StandardInput.NewLine);
                process.Close();
            }

I wanted to make sure that the program execution waits till the script finishes.So instead of using Close method, i added WaitForExit, and i am manually sending exit command to the command line after the script finishes, like below

            using (Process process = new Process())
            {
                var startInfo = new ProcessStartInfo("cmd")
                {
                    RedirectStandardInput = true,
                    RedirectStandardOutput = true,
                    WindowStyle = ProcessWindowStyle.Normal,
                    UseShellExecute = false,
                    CreateNoWindow = false
                };

                process.StartInfo = startInfo;
                process.OutputDataReceived += (sender, e) => Console.WriteLine(e.Data);
                process.Start();
                process.StandardInput.Write("script"+ process.StandardInput.NewLine);
                process.StandardInput.Write("exit" + process.StandardInput.NewLine);
                process.WaitForExit();
            }

This worked for me and the program execution waited till the script finishes.

Wednesday, June 18, 2014

Clicking problems with IE and Selenium

We were facing couple of problems with selenium tests running on IE, when running the tests locally, we don't have these issues. After adding more logs to the code, i found that sometimes it is failing after sending the click event in different steps. 
Looking online for similar issue, i found that there are clicking issues with IE, as sometimes the element being clicked on will receive the focus, but the click will not be processed by the element.
https://code.google.com/p/selenium/wiki/InternetExplorerDriver#Browser_Focus

To workaround this, i am setting the focus manually to the browser using the below line of code

Driver.SwitchTo().Window(Driver.CurrentWindowHandle);

Sunday, December 22, 2013

tcl: dumping tablelist data

For the tablelist widget I created a function to dump the table content to a file

proc dumpTableListToFile { tree { file preview.txt } } { 
set rowCount [$tree size]
set file_writer [open $file w+]
for { set i 0 } { $i < $rowCount } { incr i } {
set rowData [$tree get $i]
puts $file_writer $rowData
}
close $file_writer
}


parameters:



tree, is the table widget, file is the file name, optional.

Monday, December 16, 2013

tcl: find widget recursively

I was doing some testing for multi container application, and same widget could exist in different containers and could have variable parent name, I created a function to find the widget recursively by the last portion of the widget name
The function I initially created
   1: proc findWidgetByName { wname {widget .mainwindow} } {    
   2:     set pattern "*.${wname}" 
   3:     #puts $widget    
   4:     set all "[winfo children $widget]" 
   5:     foreach child $all  { 
   6:         #puts "$child" 
   7:         if { [winfo viewable $child] && [string match $pattern $child] } { 
   8:                 #puts $child 
   9:                 return $child            
  10:         } else { 
  11:             return [findWidgetByName $wname $child]        
  12:         } 
  13:     } 
  14:     return 0 
  15: }

Testing the above function, it was taking the first child in each “for loop” and returning without checking other childs, with the help of my colleague, we changed it to working version

   1: proc findWidgetByName { wname {widget .mainwindow} } {    
   2:     set pattern "*.${wname}" 
   3:     #puts $widget    
   4:     set all "[winfo children $widget]" 
   5:     foreach child $all  { 
   6:         #puts "$child" 
   7:         if { [winfo viewable $child] && [string match $pattern $child] } { 
   8:                 #puts $child 
   9:                 return $child            
  10:         } else { 
  11:             set x [findWidgetByName $wname $child]        
  12:             if {  $x !=0 } { 
  13:             return $x ;            
  14:             } 
  15:         } 
  16:     } 
  17:     return 0 
  18: }

When using for loops with recursion we need to put some condition when to break the for loop execution
I have created also another version to find widgets by label, in case of buttons or labels

   1: proc findWidgetByLabel { label {widget .mainwindow} } {       
   2: set all "[winfo children $widget]"
   3:     foreach child $all  {
   4:         #puts "$child"
   5:         if {([winfo class $child]== "Label" || [winfo class $child]== "Button" ) && [winfo viewable $child] && [$child cget -text]==$label } {
   6:                 #puts $child
   7:                 return $child            
   8:         } else {
   9:             set x [findWidgetByLabel $label $child]        
  10:             if {  $x !=0 } {
  11:                 return $x ;            
  12:             }
  13:         }
  14:     }
  15:     return 0
  16: }

Same can be applied to find widget by any property

Friday, December 13, 2013

Extracting tcl treeview items

I wanted to validate treeview items after doing operations on them, like add, delete. I created 2 function to extract the items and dump into a file, next i was able to compare the extracted file with the expected values

#this function dumps the 1st level in the tree to a file
proc dumpTreeDataTags { file } {
global treeControl
    set file_writer [open $file  w+]
foreach id [$treeControl item children root] {
   set data [$treeControl item tag names $id]
   puts $file_writer $data
}
    close $file_writer
}

#this function dumps all the tree data, file is appended. File must be cleared before calling this function
proc dumpAllTreeDataTags { file { item root} } {
    global treeControl
foreach id [$treeControl item children $item] {
   set file_writer [open $file  a+]
   set data [$treeControl item tag names $id]
   puts $file_writer $data
   close $file_writer
   dumpAllTreeDataTags $file $id
}
}

Explaining the functions:
The first one, i am extracting the first level only, and saving to the file, the file is opened in write mode, and replaced every time the function is called.
The second function is using recursion to iterate starting from the root node, through the children, and then calling the function again for each children, and so on. File is opened in append mode, so that when called in recursion, the previous data written to the file is not lost

Sunday, November 10, 2013

TCL: invalid command name "else"

If you are used to traditional if-else and wrote "else" in separate line in TCL like below

if { ... } {
...
}
else {
...
}

You will get an error like me: invalid command name "else"

To get ride of this error, put the "else" and the "if" ending brackets in the same line

if { ... } {
...
} else {
...
}