2013-05-20 4 views
0

그것은 코드에서 사용자 이름, 로그인 및 암호를 설정 Vista/Windows 7의 관리자를 가장 할 수 있습니까?가장을 코드에 암호를 설정

내 시나리오 : 많은 사용자 (로컬 관리 도구없이)가 C# 프로그램을 실행합니다. C# 프로그램은 파일을 C:\Windows\에 복사합니다. 프로그램이 관리자의 자격 증명을 사용하여 "Access denied"메시지를받지 않고 UAC 프롬프트에 자격 증명을 입력하지 않고 복사본을 만들길 원합니다.

나는이 두 가지 방법을 시도했다 :

  • requireAdministrator 또는 highestAvailable에 매니페스트를 포함합니다. 사용자가 자격 증명을 묻는 메시지가 표시되므로 작동하지 않습니다.
  • advapi32.dll API에서 좋은 오래된 LogonUser를 사용 사칭. 나는 그것을 마치고 매력처럼 작동하지만 Windows XP에서만 가능합니다.

이 가능합니까?

편집

나는 그런 끔찍한 일을하고있는 이유에 관심이 많은. 왜 내가 이것을 필요로하는지 설명하는 몇 가지 내 의견을 포함하도록 편집 중입니다.

우리는 각 사용자의 컴퓨터에서 예약 된 작업을 만들 수 없습니다. 이것은 하나의 컴퓨터입니다. 시간 : 네트워크 폴더에 .exe 파일을 실행하거나 (.exe를 첨부하여) 실행하도록 요청하는 모든 사용자에게 전자 메일을 보냅니다. 전체 내용은 입니다. 컴퓨터로 컴퓨터를 사용하지 마십시오.

이들 어서! 나는 이것이 rigth가 아니라는 것을 안다. 그러나 그것은 시나리오 다. 정상적이고 올바른 방법은 기업 절차에서 2 개월이 걸릴 것입니다. 일반 관리자는 사업상의 이유로 주에 Google에서이를 수행 할 수있는 방법을 찾아달라고 요청했습니다. 이것은이 예쁜 새로운 판매 "진언"와 함께 한 와 오래된 벽지를 변경하는 어리석은 일이다 ... 일부 바이러스 나 공격에 대해하지 않습니다.

+0

나는 다른 사용자가 실행할 수있는 스케줄 된 작업을 만들 것입니다. –

+2

.. 또는이 복사본을 수행 할 필요가 없도록 C# 프로그램을 수정 하시겠습니까? –

+0

@JeremyHolovacs 각 사용자 컴퓨터에서 예약 된 작업을 만들 수 없습니다. 이것은 한 가지 일입니다. 모든 사용자에게 네트워크 폴더의 .exe 파일을 실행하거나 .exe를 첨부하도록 요청하는 전자 메일을 보냅니다. 그게 전부 요점입니다. 컴퓨터로 컴퓨터를하지 마십시오. – daniloquio

답변

3

사용자의 배경 화면을 변경하는 중일 뿐이지 만 올바른 접근 방식은 2 단계 프로세스이며 그룹 정책으로 완전히 완료 될 수 있습니다.

1 단계 : 로컬 Windows 디렉터리에 네트워크 공유에서 배경을 복사 할 one time per-machine startup script 되세요.

2 단계 : 새로운 기업 배경 화면에 Update the users wallpaper. 새로운 벽지 2 단계를 제거 할 수 있습니다 오래 된 벽지와 같은 이름을 가진 경우

(업데이트해야하는 등록 키, HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\에 특별히 WallpaperWallpaperStyle이다).당신이 정말로 MUST가 원하는 방식으로 작업을 할 경우


, 여기에 내가 for my own tasks을 사용 this question에 대한 대답의 기반으로 솔루션입니다.

코드에 다음 NativeMethods 클래스를 추가하십시오. 여기

using System; 
using System.Runtime.InteropServices; 

/// <summary> 
/// Implements P/Invoke Interop calls to the operating system. 
/// </summary> 
internal static class NativeMethods 
{ 
    /// <summary> 
    /// The type of logon operation to perform. 
    /// </summary> 
    internal enum LogonType : int 
    { 
     /// <summary> 
     /// This logon type is intended for users who will be interactively 
     /// using the computer, such as a user being logged on by a 
     /// terminal server, remote shell, or similar process. 
     /// This logon type has the additional expense of caching logon 
     /// information for disconnected operations; therefore, it is 
     /// inappropriate for some client/server applications, such as a 
     /// mail server. 
     /// </summary> 
     Interactive = 2, 

     /// <summary> 
     /// This logon type is intended for high performance servers to 
     /// authenticate plaintext passwords. 
     /// The LogonUser function does not cache credentials for this 
     /// logon type. 
     /// </summary> 
     Network = 3, 

     /// <summary> 
     /// This logon type is intended for batch servers, where processes 
     /// may be executing on behalf of a user without their direct 
     /// intervention. This type is also for higher performance servers 
     /// that process many plaintext authentication attempts at a time, 
     /// such as mail or Web servers. 
     /// The LogonUser function does not cache credentials for this 
     /// logon type. 
     /// </summary> 
     Batch = 4, 

     /// <summary> 
     /// Indicates a service-type logon. The account provided must have 
     /// the service privilege enabled. 
     /// </summary> 
     Service = 5, 

     /// <summary> 
     /// This logon type is for GINA DLLs that log on users who will be 
     /// interactively using the computer. 
     /// This logon type can generate a unique audit record that shows 
     /// when the workstation was unlocked. 
     /// </summary> 
     Unlock = 7, 

     /// <summary> 
     /// This logon type preserves the name and password in the 
     /// authentication package, which allows the server to make 
     /// connections to other network servers while impersonating the 
     /// client. A server can accept plaintext credentials from a 
     /// client, call LogonUser, verify that the user can access the 
     /// system across the network, and still communicate with other 
     /// servers. 
     /// NOTE: Windows NT: This value is not supported. 
     /// </summary> 
     NetworkCleartext = 8, 

     /// <summary> 
     /// This logon type allows the caller to clone its current token 
     /// and specify new credentials for outbound connections. The new 
     /// logon session has the same local identifier but uses different 
     /// credentials for other network connections. 
     /// NOTE: This logon type is supported only by the 
     /// LOGON32_PROVIDER_WINNT50 logon provider. 
     /// NOTE: Windows NT: This value is not supported. 
     /// </summary> 
     NewCredentials = 9 
    } 

    /// <summary> 
    /// Specifies the logon provider. 
    /// </summary> 
    internal enum LogonProvider : int 
    { 
     /// <summary> 
     /// Use the standard logon provider for the system. 
     /// The default security provider is negotiate, unless you pass 
     /// NULL for the domain name and the user name is not in UPN format. 
     /// In this case, the default provider is NTLM. 
     /// NOTE: Windows 2000/NT: The default security provider is NTLM. 
     /// </summary> 
     Default = 0, 

     /// <summary> 
     /// Use this provider if you'll be authenticating against a Windows 
     /// NT 3.51 domain controller (uses the NT 3.51 logon provider). 
     /// </summary> 
     WinNT35 = 1, 

     /// <summary> 
     /// Use the NTLM logon provider. 
     /// </summary> 
     WinNT40 = 2, 

     /// <summary> 
     /// Use the negotiate logon provider. 
     /// </summary> 
     WinNT50 = 3 
    } 

    /// <summary> 
    /// The type of logon operation to perform. 
    /// </summary> 
    internal enum SecurityImpersonationLevel : int 
    { 
     /// <summary> 
     /// The server process cannot obtain identification information 
     /// about the client, and it cannot impersonate the client. It is 
     /// defined with no value given, and thus, by ANSI C rules, 
     /// defaults to a value of zero. 
     /// </summary> 
     Anonymous = 0, 

     /// <summary> 
     /// The server process can obtain information about the client, 
     /// such as security identifiers and privileges, but it cannot 
     /// impersonate the client. This is useful for servers that export 
     /// their own objects, for example, database products that export 
     /// tables and views. Using the retrieved client-security 
     /// information, the server can make access-validation decisions 
     /// without being able to use other services that are using the 
     /// client's security context. 
     /// </summary> 
     Identification = 1, 

     /// <summary> 
     /// The server process can impersonate the client's security 
     /// context on its local system. The server cannot impersonate the 
     /// client on remote systems. 
     /// </summary> 
     Impersonation = 2, 

     /// <summary> 
     /// The server process can impersonate the client's security 
     /// context on remote systems. 
     /// NOTE: Windows NT: This impersonation level is not supported. 
     /// </summary> 
     Delegation = 3 
    } 

    /// <summary> 
    /// Logs on the user. 
    /// </summary> 
    /// <param name="userName">Name of the user.</param> 
    /// <param name="domain">The domain.</param> 
    /// <param name="password">The password.</param> 
    /// <param name="logonType">Type of the logon.</param> 
    /// <param name="logonProvider">The logon provider.</param> 
    /// <param name="token">The token.</param> 
    /// <returns>True if the function succeeds, false if the function fails. 
    /// To get extended error information, call GetLastError.</returns> 
    [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    internal static extern bool LogonUser(
     string userName, 
     string domain, 
     string password, 
     LogonType logonType, 
     LogonProvider logonProvider, 
     out IntPtr token); 

    /// <summary> 
    /// Duplicates the token. 
    /// </summary> 
    /// <param name="existingTokenHandle">The existing token 
    /// handle.</param> 
    /// <param name="securityImpersonationLevel">The security impersonation 
    /// level.</param> 
    /// <param name="duplicateTokenHandle">The duplicate token 
    /// handle.</param> 
    /// <returns>True if the function succeeds, false if the function fails. 
    /// To get extended error information, call GetLastError.</returns> 
    [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    internal static extern bool DuplicateToken(
     IntPtr existingTokenHandle, 
     SecurityImpersonationLevel securityImpersonationLevel, 
     out IntPtr duplicateTokenHandle); 

    /// <summary> 
    /// Closes the handle. 
    /// </summary> 
    /// <param name="handle">The handle.</param> 
    /// <returns>True if the function succeeds, false if the function fails. 
    /// To get extended error information, call GetLastError.</returns> 
    [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    internal static extern bool CloseHandle(IntPtr handle); 
} 

코드에서 사용될 수있는 구현이다.

IntPtr token; 

    if (!NativeMethods.LogonUser(
     this.userName, 
     this.domain, 
     this.password, 
     NativeMethods.LogonType.NewCredentials, 
     NativeMethods.LogonProvider.Default, 
     out token)) 
    { 
     throw new Win32Exception(); 
    } 

    try 
    { 
     IntPtr tokenDuplicate; 

     if (!NativeMethods.DuplicateToken(
      token, 
      NativeMethods.SecurityImpersonationLevel.Impersonation, 
      out tokenDuplicate)) 
     { 
      throw new Win32Exception(); 
     } 

     try 
     { 
      using (WindowsImpersonationContext impersonationContext = 
       new WindowsIdentity(tokenDuplicate).Impersonate()) 
      { 
       //Copy your file to the windows directory here. 

       impersonationContext.Undo(); 
       return; 
      } 
     } 
     finally 
     { 
      if (tokenDuplicate != IntPtr.Zero) 
      { 
       if (!NativeMethods.CloseHandle(tokenDuplicate)) 
       { 
        // Uncomment if you need to know this case. 
        ////throw new Win32Exception(); 
       } 
      } 
     } 
    } 
    finally 
    { 
     if (token != IntPtr.Zero) 
     { 
      if (!NativeMethods.CloseHandle(token)) 
      { 
       // Uncomment if you need to know this case. 
       ////throw new Win32Exception(); 
      } 
     } 
    } 
+0

-1 이것은 내 질문에 답하지 않습니다. 나는 매우 구체적인 질문을했고 배경 화면에 관한 것이 아니었다. 또한 그룹 정책을 제어 할 수 없기 때문에 이와 같은 작업을 수행 할 수 없습니다. – daniloquio

+1

예,하지만 [XY 문제] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)로 빠져 들었습니다! 문제에 대한 다른 해결책을 찾아 대신 사용하는 대신 문제에 대한 시도 된 해결책을 수정하는 데 너무 많은 노력을 기울이고 있습니다. Windows 디렉토리로 파일을 복사해야하는 이유를 설명하기 위해 원래 질문을 업데이트 한 경우보다 나은 답변을 얻을 수 있습니다. 그룹 정책을 변경 한 이유를 설명 할 수없는 이유를 설명해 주시겠습니까? 이 상황은 그룹 정책을 위해 고안된 것입니다. –

+0

우리가 필요한 것은 3 개국의 사용자에게 영향을 미치기 때문입니다.그룹 정책은 다른 대륙에 위치하고 120 개 이상의 국가를 관리하는 팀에 의해 관리됩니다. 사용자에게 파일 위치를 변경하는 응용 프로그램을 보낼 수 있습니다. 그룹 정책을 변경할 수는 없습니다. 저를 신뢰하십시오 : 우리의 모든 가능성을 검토 한 결과 기술적 인면에서 그 중 하나가 가능한지 확인하기 위해 왔습니다. – daniloquio

3

다른 사람이 말했듯이, 당신의 해결 방법은 몇 가지 모범 사례를 파괴하고, "그냥 지금 수행하는 데 필요한는"역사는 보여 주었다으로 모범 사례를 파괴하는 나쁜 시간이다. 그래서 가장 먼저 할 권장 사항 몇 :

  • 최소한의 권한이 매우 짧은 계정
  • 내놔 필요한 계정이
  • 적어 보라 (< 일주) 시간 제한에 대한 새로운 계정을 확인

적어도 1 년 후 누군가가 프로그램에 걸려 넘어 질 수없고 어디서나 관리자 권한을 가질 수 있습니다. 이와 같은 프로그램을 사용하면 하루 만에 걸릴 수 있습니다. 그러나 이미 이와 같은 것들로 보안의 무용지물이 지적되었습니다.

주어진 점을 감안하면 post talking about a breaking change in LogonUser입니다. 그것은에서 DllImport 코드를 변경 요구 :

[DllImport("advapi32.dll", SetLastError = true)] 
private extern static bool LogonUser(
    string pszUsername, string pszDomain, string pszPassword, 
    int dwLogonType, int dwLogonProvider, ref IntPtr phToken); 

사람 : 그 문제 "Windows XP에서만 작동합니다"해결 할 수있는 경우

[DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)] 
public static extern bool LogonUser(String lpszUsername, String lpszDomain, 
    String lpszPassword, int dwLogonType, int dwLogonProvider, 
    out SafeTokenHandle phToken); 

참조.

이제 프로그래밍 문제에 대한 해결책을 얻었으므로 회사 정책에 따라 IT 부서에 새로운 배경 화면을 배포하는 데 2 ​​개월이 소요되는 이유를 알아 냈습니다. 이러한 종류의 문제는 타임 라인이 너무 길어지기 때문에 더 이상 문제를 해결할 수 없게 될 수도 있습니다. (오, 그 서비스 계정은 3 년 된 패스워드를 가지고 있으며 도메인 관리자이기 때문에 많은 서류 작업이 필요합니다 ...)

+0

답변 해 주셔서 감사합니다. – daniloquio

+0

이미 시도하고 행운; 여전히 액세스가 거부 된 Windows 7에서 오류가 발생합니다. – daniloquio