Yubico Forum

...visit our web-store at store.yubico.com
It is currently Tue Jan 30, 2018 9:33 pm

All times are UTC + 1 hour




Post new topic Reply to topic  [ 1 post ] 
Author Message
PostPosted: Mon Apr 27, 2015 6:47 pm 
Offline

Joined: Sat Jan 14, 2012 6:01 pm
Posts: 7
I have been fighting a battle with a sharing violation for about 3 days now and I finally solved the problem so I thought I'd document my solution here in case it is in any way helpful to others.

I'm using GPG2.1 on Windows 7 with two other card readers in addition to the Yubikey Neo. After a lot of searching the common consensus was that this is caused by another program blocking scdaemon's access. But which one? Through the process of elimination I found that, at least for me, the process is the service "Certificate Propagation Service".

I cobbled together a script from snippets I found online and set it to run (with highest privileges) on login using Task Scheduler. It still isn't perfect, for example, I'd like for it to mount my flash drive if it's not already mounted, but I haven't figured out how to do that yet. However, it will wait until I get around to doing it manually. My GPG keyring is on a bitlocker encrypted flash drive, so it's important that it wait until the drive is accessible. You may not need this part so you can of course modify it to suit your needs. I'm sure there are different ways to accomplish this and most likely even better ways, and I'd appreciate any improvements, but it works for me as is, at least well enough.

The script basically just stop the problem service, restarts the smart card service, runs gpg --card-status, then starts the certificate propagation service up again.

Sources:
http://www.motobit.com/tips/detpg_vbs-w ... t-service/
http://www.tek-tips.com/viewthread.cfm?qid=1619385
viewtopic.php?f=26&t=1718
* Some others I don't remember

Code:
Set fso = CreateObject("Scripting.FileSystemObject")
Set WshShell = CreateObject("WScript.Shell" )

' Make sure that the USB flash drive containing my GnuPG keyring is mounted.
' It's encrypted so we need to wait, since we don't want to do anything else until it is mounted.
Do
If fso.FolderExists("D:\private\gpg") Then
   'safe to continue
   Exit Do
Else
   WScript.Sleep 10000
End If
Loop

StopService ".", "CertPropSvc", True
RestartServices ".", "SCardSvr"
gpgagent = Quotes("C:\Program Files (x86)\GnuPG\bin\gpg.exe") & _
" --card-status "
WshShell.Run gpgagent, 0
' Give it a chance to start the daemon and read from the smart card
WScript.Sleep 10000
StartService ".", "CertPropSvc", True
Set WshShell = Nothing

Sub RestartServices(Computer, ServiceNames)
  Dim ServiceName, Counter, aServiceNames

  'Get the array of service names 
  aServiceNames = split(ServiceNames,",")
 
  'loop services from beginning, stop them
  For Each ServiceName In aServiceNames
    StopService Computer, ServiceName, True
  Next

  'loop services from end, start them
  For Counter = ubound(aServiceNames) To 0 Step -1
    StartService Computer, aServiceNames(Counter), True
  Next
End Sub

Function Quotes(ByVal strValue)
    Quotes = Chr(34) & strValue & Chr(34)
End Function

Sub StopService(Computer, ServiceName, Wait)
  Dim cimv2, oService, Result

  'Get the WMI administration object   
  Set cimv2 = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _ 
  Computer & "\root\cimv2")

  'Get the service object
  Set oService = cimv2.Get("Win32_Service.Name='" & ServiceName & "'")
 
  'Check base properties
  If Not oService.Started Then
    ' the service is Not started
    'wscript.echo "The service " & ServiceName & " is Not started"
    exit Sub
  End If

  If Not oService.AcceptStop Then
    ' the service does Not accept stop command
    'wscript.echo "The service " & ServiceName & " does Not accept stop command"
    exit Sub
  End If
 
  'wscript.echo oService.getobjecttext_

  'Stop the service
  Result  = oService.StopService
  If 0 <> Result Then
    'wscript.echo "Stop " & ServiceName & " error: " & Result
    exit Sub
  End If
 
  Do While oService.Started And Wait
    'get the current service state
    Set oService = cimv2.Get("Win32_Service.Name='" & ServiceName & "'")
    'wscript.echo now, "StopService", ServiceName, oService.Started, _
   'oService.State, oService.Status
    Wscript.Sleep 200
  Loop   
End Sub


Sub StartService(Computer, ServiceName, Wait)
  Dim cimv2, oService, Result

  'Get the WMI administration object   
  Set cimv2 = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _
  Computer & "\root\cimv2")

  'Get the service object
  Set oService = cimv2.Get("Win32_Service.Name='" & ServiceName & "'")
   
  'Path = "winmgmts:{impersonationLevel=impersonate}!\\" & Computer & _
  '  "\root\cimv2:Win32_Service.Name='" & ServiceName & "'"

  'Get the WMI administration object of the service   
  'Set oService = GetObject(Path)

  'Check base properties
  If oService.Started Then
    ' the service is Not started
    'wscript.echo "The service " & ServiceName & " is started."
    exit Sub
  End If
 
  'Start the service
  Result = oService.StartService
  If 0 <> Result Then
    'wscript.echo "Start " & ServiceName & " error:" & Result
    exit Sub
  End If
 
  Do While InStr(1,oService.State,"running",1) = 0 And Wait
    'get the current service state
    Set oService = cimv2.Get("Win32_Service.Name='" & ServiceName & "'")
    'wscript.echo now, "StartService", ServiceName, oService.Started, _
   'oService.State, oService.Status
    Wscript.Sleep 200
  Loop   
End Sub


I hope this saves someone a little time and stress.


Top
 Profile  
Reply with quote  

Share On:

Share on Facebook FacebookShare on Twitter TwitterShare on Tumblr TumblrShare on Google+ Google+

Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 1 post ] 

All times are UTC + 1 hour


Who is online

Users browsing this forum: No registered users and 11 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group