Vb.net 以管理员身份运行ClickOnce应用程序
我有一个vb.net clickonce应用程序,将由没有管理员访问权限的低级人员使用。但是,应用程序本身需要将文件保存到服务器上隐藏的文件夹中,该文件夹只允许管理员进行读/写访问。我需要这些用户能够使用该应用程序与该文件夹交互,而不需要让他们自己浏览该文件夹。我尝试过使用几种模拟技术,但没有一种有效 是我试过的。尽管运行Return System.Security.Principal.WindowsIdentity.GetCurrent().Name时返回管理员凭据,但它仍然表示访问被拒绝 我已尝试创建另一个应用程序,该应用程序仅使用管理员凭据执行StartProcess,但我尝试启动的文件是.application而不是.exe,因此出现“指定的可执行文件不是此操作系统平台的有效应用程序”错误 我已尝试为Internet Explorer执行StartProcess,并提供一个参数.application文件的url,该参数一直有效,直到我尝试提供除我自己的凭据之外的凭据,并出现“找不到文件”错误。如果我删除了从p.Username到Next的所有内容,应用程序将打开,但它是作为用户而不是管理员打开的。下面是该尝试的代码Vb.net 以管理员身份运行ClickOnce应用程序,vb.net,clickonce,impersonation,Vb.net,Clickonce,Impersonation,我有一个vb.net clickonce应用程序,将由没有管理员访问权限的低级人员使用。但是,应用程序本身需要将文件保存到服务器上隐藏的文件夹中,该文件夹只允许管理员进行读/写访问。我需要这些用户能够使用该应用程序与该文件夹交互,而不需要让他们自己浏览该文件夹。我尝试过使用几种模拟技术,但没有一种有效 是我试过的。尽管运行Return System.Security.Principal.WindowsIdentity.GetCurrent().Name时返回管理员凭据,但它仍然表示访问被拒绝 我
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim p As New ProcessStartInfo(My.Computer.FileSystem.SpecialDirectories.ProgramFiles + "\Internet Explorer\IEXPLORE.EXE")
p.UseShellExecute = False
p.Domain = "domain"
p.UserName = "administrator"
p.Password = New System.Security.SecureString()
For Each c As Char In "password"
p.Password.AppendChar(c)
Next
p.Arguments = ("URL to .application file")
Process.Start(p)
End Sub
我完全不知道如何让这个应用程序以管理员的身份运行,这样用户就可以只使用这个应用程序查看文件并将文件保存到这个受保护的位置 这听起来像是服务器上WCF(或其他类型)服务的最佳候选。这将提供方法来做你想做的事情。客户端应用程序会调用该服务并说“将此文件放到服务器上”,而服务代码就是实际保存该文件的代码。由于它在服务器上运行,因此服务的用户帐户可以拥有必要的权限,而不存在您现在面临的任何客户端权限问题。客户端用户除了能够连接到服务之外,根本不需要任何特权
另一个好处是,使用此方法的客户端应用程序中没有管理员帐户密码,这将消除一个相当严重的安全问题。这听起来很适合在服务器上使用WCF(或其他类型)服务。这将提供方法来做你想做的事情。客户端应用程序会调用该服务并说“将此文件放到服务器上”,而服务代码就是实际保存该文件的代码。由于它在服务器上运行,因此服务的用户帐户可以拥有必要的权限,而不存在您现在面临的任何客户端权限问题。客户端用户除了能够连接到服务之外,根本不需要任何特权
另一个好处是,使用此方法的客户端应用程序中没有管理员帐户密码,这将消除一个相当严重的安全问题。您无法提升ClickOnce应用程序的权限,它也无法执行任何需要管理权限的操作。WCF服务的想法很有趣。您唯一可以做的另一件事是在部署中包含一个exe文件,该文件执行您希望它执行的操作,并使用ClickOnce应用程序的提升权限运行它
是的,没错,你不能用提升的权限运行ClickOnce应用程序,但它可以启动一个进程,然后提升权限本身 不能提升ClickOnce应用程序的权限,也不能执行任何需要管理权限的操作。WCF服务的想法很有趣。您唯一可以做的另一件事是在部署中包含一个exe文件,该文件执行您希望它执行的操作,并使用ClickOnce应用程序的提升权限运行它
是的,没错,你不能用提升的权限运行ClickOnce应用程序,但它可以启动一个进程,然后提升权限本身 哦,忘了提一下,我还尝试将.appref ms作为应用程序引用添加到我的项目中,并在processstartinfo()区域中使用它,结果成功了。但是默认情况下,.appref ms文件clickonce存储在c:\\user\中,然后存储登录用户的用户名。因此,为了让它工作,我需要能够动态地将引用的这一部分更改为登录用户是什么。因此,如果有人知道如何做到这一点,可能会更容易。谢谢哦,忘了提一下,我还尝试将.appref ms作为应用程序引用添加到我的项目中,并在processstartinfo()区域中使用它,结果成功了。但是默认情况下,.appref ms文件clickonce存储在c:\\user\中,然后存储登录用户的用户名。因此,为了让它工作,我需要能够动态地将引用的这一部分更改为登录用户是什么。因此,如果有人知道如何做到这一点,可能会更容易。谢谢谢谢你,特里德斯。我不熟悉WCF,但我会检查一下。我完全明白你在说什么。但是,我如何才能确保我的WCF中公开的方法将以管理员身份运行?WCF在服务器上运行,您可以将该进程(启动的侦听器应用程序,或者在IIS中托管的特定web服务器工作程序)设置为任何运行。但它不应该是“管理员”。它应该是一个专门为此创建的用户,并被授予访问它所需的任何目录的权限。谢谢Tridus。我不熟悉WCF,但我会检查一下。我完全明白你在说什么。但是,我如何才能确保我的WCF中公开的方法将以管理员身份运行?WCF在服务器上运行,您可以将该进程(启动的侦听器应用程序,或者在IIS中托管的特定web服务器工作程序)设置为任何运行。但它不应该是“管理员”。它应该是一个专门为此创建的用户,并被授权访问它需要的任何目录。
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim p As New ProcessStartInfo(My.Computer.FileSystem.SpecialDirectories.ProgramFiles + "\Internet Explorer\IEXPLORE.EXE")
p.UseShellExecute = False
p.Domain = "domain"
p.UserName = "administrator"
p.Password = New System.Security.SecureString()
For Each c As Char In "password"
p.Password.AppendChar(c)
Next
p.Arguments = ("URL to .application file")
Process.Start(p)
End Sub