Vb.net 使用自代码签名证书进行发布

Vb.net 使用自代码签名证书进行发布,vb.net,clickonce,Vb.net,Clickonce,我在这个主题中搜索了很多次,但运气不好,我在WPF上有一个应用程序,使用单击一次发布,因此我不能使用管理员权限,我需要在安装过程中执行一些操作,例如重新启动SQL server,为此我需要管理员权限。由于我开始使用click once发布,我现在必须删除管理员权限,因此我尝试使用以下代码重新启动应用程序以强制管理员权限,但没有成功 Public Function IsRunAsAdmin() As Boolean Try Dim id As WindowsIdentity

我在这个主题中搜索了很多次,但运气不好,我在WPF上有一个应用程序,使用单击一次发布,因此我不能使用管理员权限,我需要在安装过程中执行一些操作,例如重新启动SQL server,为此我需要管理员权限。由于我开始使用click once发布,我现在必须删除管理员权限,因此我尝试使用以下代码重新启动应用程序以强制管理员权限,但没有成功

Public Function IsRunAsAdmin() As Boolean
    Try
        Dim id As WindowsIdentity = WindowsIdentity.GetCurrent()
        Dim principal As WindowsPrincipal = New WindowsPrincipal(id)
        Return principal.IsInRole(WindowsBuiltInRole.Administrator)
    Catch __unusedException1__ As Exception
        Return False
    End Try
End Function

Public Sub AdminRelauncher()
    If Not IsRunAsAdmin() Then
        Dim proc As ProcessStartInfo = New ProcessStartInfo()
        Dim procExecuting As New Process
        proc.UseShellExecute = True
        proc.WorkingDirectory = Environment.CurrentDirectory
        proc.FileName = Assembly.GetEntryAssembly().CodeBase
        proc.Verb = "runas"
        Try
            procExecuting = Process.Start(proc)
            Application.ExitThread()
            Application.Exit()
        Catch ex As Exception
            Console.WriteLine("This program must be run as an administrator! " & vbLf & vbLf & ex.ToString())
        End Try
    End If
End Sub
我仍然得到错误“无法打开MSSQL$******在计算机上”后,我搜索当然我发现原因是管理员权限需要。 所以现在我正在研究代码签名证书,因为有人告诉我这对我来说是可行的。 但我是个人,我的应用程序价格不足以购买付费证书,所以我想知道我是否可以制作一个自我代码签名证书,并与click once一起使用。
谢谢。

我终于自己解决了这个问题,那是管理员权限问题。 问题是代码只需要2-3英里秒就可以执行,所以当我跟踪代码时,我发现我的代码确实停止了服务,但无法再次启动,因为它没有花时间让服务完全停止

解决方案很简单,因为它只需要几秒钟就可以在执行代码后停止服务

所以只需要在两者之间添加一个代码。 首先

然后使用如下代码

Dim service As ServiceController = New ServiceController("SQL Server (SQLEXPRESS)")
                    service.Stop()
                    Thread.Sleep(10000)
                    service.Start()
您可以看到Thread.sleep所在的代码,它让应用程序等待10秒钟,然后才能完成执行代码

这个时间取决于机器本身,2-3秒就足够了,但是其他一些机器需要更多的时间,所以为了安全起见,只需像我一样增加更多的秒数

谢谢你,还有“保持安全”

Dim service As ServiceController = New ServiceController("SQL Server (SQLEXPRESS)")
                    service.Stop()
                    Thread.Sleep(10000)
                    service.Start()