1

誰もこれを達成する方法を知っていますか?

  • 1 台の PC に、通常のユーザーが 3 人、管理者が 2 人の合計 5 人がいます。
  • ファイルを作成し、管理者 2だけがそのファイルにアクセスしたり、削除したりできるように、管理者 2 だけが利用できる所有権とアクセス許可を設定するには、管理者 1 アカウントで実行されている VB.net アプリケーションが必要です。
  • 管理者 1 は Windows 経由でファイルにアクセスできませんが、そのユーザー アカウントで実行されているアプリケーションはアクセスできます。
  • したがって、その間 (アプリが管理者 1 で実行されている間)、ファイルを変更する必要がある場合、アプリケーションは再びファイルを変更できるはずです。

注:アプリケーションは、両方のアカウントのパスワードとログイン情報を認識しています。

4

3 に答える 3

2

LogonUser とWindowsIdentity.Impersonateを試しましたか?

于 2013-01-16T01:15:32.010 に答える
1

管理者1はウィンドウからファイルにアクセスできませんが、そのユーザーアカウントで実行されているアプリケーション(管理者1)はアクセスできます。

あなたはこれをあなたが望むように起こさせることはできません。admin 1で実行されているプログラムは、そのユーザーです。プログラムが可能であれば、ユーザーはいつでもWindows経由でファイルにアクセスできます。

プログラムにファイル内のデータを暗号化させることができます。admin 1ユーザーは、暗号化されたコンテンツ(一見ランダムなデータ)を読み取り、それを変更(したがって破棄)するか、ファイルを削除することができます。ただし、そのユーザーが暗号化を破らない限り、プログラム(ファイルがどのように暗号化されたかを知っている)だけが有効な変更を加えることができます。ファイルを操作する必要がある他のユーザーは、プログラム(または使用するためにファイルを復号化できる別のユーザー)を介してファイルにアクセスする必要があります。

別の方法は、別のユーザーアカウントを作成し、管理者2と新しいアカウントにのみファイルへのアクセスを許可し、その新しいアカウントを「偽装」した後にアプリケーションにアクセスさせることです。次に、管理者1を除くすべてのユーザーのプログラム自体へのアクセスを拒否します。ただし、これを行っても、「ドメイン管理者」がファイルを取得する可能性があります。

ソフトウェアを介してファイルの内容を操作するユーザーは、(たとえば)ファイルを印刷したりクリップボードにコピーしたりして、何でもできることに注意してください。従業員が正しいことをすることを信頼できない場合は、とにかく運命にあるでしょう。

于 2013-01-15T20:53:33.563 に答える
0

MSDNで少し時間を過ごした後、これが私が思いついたすべてです。これは、Windowsが提供する「Run as」と同じものです

テスト済みで正常に動作

コード :

 Imports System
 Imports System.Runtime.InteropServices


 Module Module1

    Public Infinite As System.UInt32 = Convert.ToUInt32(&HFFFFFFF)
    Public Startf_UseStdHandles As Int32 = &H100
    Public StdOutputHandle As Int32 = -11
    Public StdErrorHandle As Int32 = -12

    <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Auto)> _
    Public Structure StartupInfo
        Public cb As Integer
        Public reserved As String
        Public desktop As String
        Public title As String
        Public x As Integer
        Public y As Integer
        Public xSize As Integer
        Public ySize As Integer
        Public xCountChars As Integer
        Public yCountChars As Integer
        Public fillAttribute As Integer
        Public flags As Integer
        Public showWindow As UInt16
        Public reserved2 As UInt16
        Public reserved3 As Byte
        Public stdInput As IntPtr
        Public stdOutput As IntPtr
        Public stdError As IntPtr
    End Structure 'StartupInfo

    Friend Structure ProcessInformation
        Public process As IntPtr
        Public thread As IntPtr
        Public processId As Integer
        Public threadId As Integer
    End Structure 'ProcessInformation


    <DllImport("advapi32.dll", SetLastError:=True, CharSet:=CharSet.Unicode)> _
    Public Function CreateProcessWithLogonW(ByVal userName As String, ByVal domain As String, ByVal password As String, ByVal logonFlags As UInt32, ByVal applicationName As String, ByVal commandLine As String, ByVal creationFlags As UInt32, ByVal environment As UInt32, ByVal currentDirectory As String, ByRef startupInfo As StartupInfo, ByRef processInformation As ProcessInformation) As Boolean
    End Function


    <DllImport("kernel32.dll", SetLastError:=True)> _
    Public Function GetExitCodeProcess(ByVal process As IntPtr, ByRef exitCode As UInt32) As Boolean
    End Function


    <DllImport("Kernel32.dll", SetLastError:=True)> _
    Public Function WaitForSingleObject(ByVal handle As IntPtr, ByVal milliseconds As UInt32) As UInt32
    End Function


    <DllImport("Kernel32.dll", SetLastError:=True)> _
    Public Function GetStdHandle(ByVal handle As IntPtr) As IntPtr
    End Function


    <DllImport("Kernel32.dll", SetLastError:=True)> _
    Public Function CloseHandle(ByVal handle As IntPtr) As Boolean
    End Function


    <STAThread()> _
    Overloads Sub Main(ByVal args() As String)
        Dim MyPointer As IntPtr = Marshal.AllocHGlobal(4)
        Marshal.WriteInt32(MyPointer, StdOutputHandle)
        Dim MyErrorPointer As IntPtr = Marshal.AllocHGlobal(4)
        Marshal.WriteInt32(MyErrorPointer, StdErrorHandle)
        Dim startupInfo As New StartupInfo
        startupInfo.reserved = Nothing
        startupInfo.flags = startupInfo.flags And Startf_UseStdHandles
        startupInfo.stdOutput = MyPointer  
        startupInfo.stdError = MyErrorPointer     

        Dim exitCode As System.UInt32 = Convert.ToUInt32(123456)
        Dim processInfo As New ProcessInformation

        Dim command As String = "c:\windows\Notepad.exe"
        Dim user As String = "administrator"
        Dim domain As String = System.Environment.MachineName
        Dim password As String = "admin acct password"
        Dim currentDirectory As String = System.IO.Directory.GetCurrentDirectory()

        Try
            CreateProcessWithLogonW(user, domain, password, Convert.ToUInt32(1), _
                command, command, Convert.ToUInt32(0), Convert.ToUInt32(0), _
                currentDirectory, startupInfo, processInfo)
        Catch e As Exception
            Console.WriteLine(e.ToString())
        End Try
        Console.WriteLine("Running ...")
        WaitForSingleObject(processInfo.process, Infinite)
        GetExitCodeProcess(processInfo.process, exitCode)

        Console.WriteLine("Exit code: {0}", exitCode)

        CloseHandle(processInfo.process)
        CloseHandle(processInfo.thread)
    End Sub 

End Module
于 2013-01-23T09:48:23.600 に答える