2009-09-22 11 views
1

나는 누군가가 도와 줄 수 있기를 바라고있다. Linux 서버에있는 파일에서 File Owner 정보를 가져와야하는 C# 응용 프로그램이 있습니다. .Net System.IO GetFileInfo가 예외를 throw하고 WMI 호출이 실패합니다. PInvoke 메서드 인 GetFileOwner가 있지만 pinvoke.net의 예제가 완전하지 않으며 컴파일되지 않는다는 것을 알고 있습니다. 누구든지이 완벽한 정보를 찾을 수있는 좋은 예나 링크가 있습니까?C# Linux 파일에서 파일 소유자 가져 오기

이것은 .Net C# 3.5 Windows 응용 프로그램이며 파일에 액세스 할 수있는 권한이 있지만 나머지 처리를 수행하기 전에 소유자 정보를 얻고 싶습니다.

감사합니다.

답변

2

다음은 내가 사용한 코드 샘플입니다. 그것은 내 응용 프로그램과 내 환경에서 작동합니다. 다른 사람들과 협력해야한다. StackOverFlow를 처음 사용하게되어 죄송합니다. 나는이 게시물이 적절하게 희망한다.

public class GetUserInfo{ 
private const int NAME_SIZE = 0x40; 

// Methods 
[DllImport("advapi32.dll", CharSet=CharSet.Auto, SetLastError=true)] 
private static extern bool ConvertSidToStringSid(IntPtr Sid, ref IntPtr StringSid); 
public string ConvertSidToStringSidNT(IntPtr Sid) 
{ 
    string ans = string.Empty; 
    if (IsValidSid(Sid)) 
    { 
     ans = "S-1-"; 
     SID_IDENTIFIER_AUTHORITY psia = (SID_IDENTIFIER_AUTHORITY) Marshal.PtrToStructure(GetSidIdentifierAuthority(Sid), typeof(SID_IDENTIFIER_AUTHORITY)); 
     int num = Marshal.ReadInt16(GetSidSubAuthorityCount(Sid)); 
     if ((psia.Value[0] != 0) & (psia.Value[1] != 0)) 
     { 
      ans = ((ans + Conversion.Hex(psia.Value[0]) + Conversion.Hex(psia.Value[1]).PadLeft(2, '0')) + Conversion.Hex(psia.Value[2]).PadLeft(2, '0') + Conversion.Hex(psia.Value[3]).PadLeft(2, '0')) + Conversion.Hex(psia.Value[4]).PadLeft(2, '0') + Conversion.Hex(psia.Value[5]).PadLeft(2, '0'); 
     } 
     else 
     { 
      long top = psia.Value[5]; 
      top += psia.Value[4] * 0x100; 
      top += (psia.Value[3] * 0x100) * 0x100; 
      ans = ans + ((top + (((psia.Value[2] * 0x100) * 0x100) * 0x100))).ToString(); 
     } 
     int VB$t_i4$L0 = num - 1; 
     for (int i = 0; i <= VB$t_i4$L0; i++) 
     { 
      ans = ans + "-" + Marshal.ReadInt32(GetSidSubAuthority(Sid, i)).ToString(); 
     } 
    } 
    return ans; 
} 

public string GetFileOwner(string Path) 
{ 
    string MachineName; 
    IntPtr OwnerSid; 
    int peUse; 
    IntPtr SD; 
    string UserName; 
    IntPtr VB$t_struct$N0; 
    SE_OBJECT_TYPE ObjectType = SE_OBJECT_TYPE.SE_FILE_OBJECT; 
    if (GetNamedSecurityInfo(ref Path, ObjectType, SECURITY_INFORMATION.OWNER_SECURITY_INFORMATION, ref OwnerSid, ref VB$t_struct$N0, ref VB$t_struct$N0, ref VB$t_struct$N0, ref SD) != 0) 
    { 
     return "Error"; 
    } 
    Marshal.FreeHGlobal(SD); 
    if (Path.StartsWith(@"\\")) 
    { 
     MachineName = Path.Split(new char[] { '\\' })[2]; 
    } 
    else 
    { 
     MachineName = ""; 
    } 
    int name_len = 0x40; 
    int domain_len = 0x40; 
    string name = Strings.Space(name_len); 
    string domain_name = Strings.Space(domain_len); 
    if (!LookupAccountSid(ref MachineName, OwnerSid, ref name, ref name_len, ref domain_name, ref domain_len, ref peUse)) 
    { 
     string SidString; 
     if (Marshal.GetLastWin32Error() != 0x534) 
     { 
      return "Error"; 
     } 
     if (Environment.Version.Major == 4) 
     { 
      SidString = this.ConvertSidToStringSidNT(OwnerSid); 
     } 
     else 
     { 
      IntPtr StringPtr; 
      if (!ConvertSidToStringSid(OwnerSid, ref StringPtr)) 
      { 
       return "Error"; 
      } 
      SidString = Marshal.PtrToStringAuto(StringPtr); 
      Marshal.FreeHGlobal(StringPtr); 
     } 
     domain_len = 0; 
     name = SidString; 
     name_len = Strings.Len(name); 
    } 
    if (domain_len > 0) 
    { 
     UserName = Strings.Left(name, name_len); 
    } 
    else 
    { 
     UserName = Strings.Left(name, name_len); 
    } 
    return UserName; 
} 

[DllImport("advapi32.dll", CharSet=CharSet.Auto, SetLastError=true)] 
private static extern int GetNamedSecurityInfo([MarshalAs(UnmanagedType.VBByRefStr)] ref string pObjectName, SE_OBJECT_TYPE ObjectType, SECURITY_INFORMATION SecurityInfo, ref IntPtr ppsidOwner, ref IntPtr ppsidGroup, ref IntPtr ppDacl, ref IntPtr ppSacl, ref IntPtr ppSecurityDescriptor); 
[DllImport("advapi32.dll", CharSet=CharSet.Ansi, SetLastError=true, ExactSpelling=true)] 
private static extern IntPtr GetSidIdentifierAuthority(IntPtr pSid); 
[DllImport("advapi32.dll", CharSet=CharSet.Ansi, SetLastError=true, ExactSpelling=true)] 
private static extern IntPtr GetSidSubAuthority(IntPtr pSid, int nSubAuthority); 
[DllImport("advapi32.dll", CharSet=CharSet.Ansi, SetLastError=true, ExactSpelling=true)] 
private static extern IntPtr GetSidSubAuthorityCount(IntPtr pSid); 
[DllImport("advapi32.dll", CharSet=CharSet.Ansi, SetLastError=true, ExactSpelling=true)] 
private static extern bool IsValidSid(IntPtr pSid); 
[DllImport("advapi32.dll", CharSet=CharSet.Auto, SetLastError=true)] 
private static extern bool LookupAccountSid([MarshalAs(UnmanagedType.VBByRefStr)] ref string lpSystemName, IntPtr lpSid, [MarshalAs(UnmanagedType.VBByRefStr)] ref string lpName, ref int cchName, [MarshalAs(UnmanagedType.VBByRefStr)] ref string lpReferenceDomainName, ref int cchReferencedDomainName, ref int peUse); 

// Nested Types 
private enum SE_OBJECT_TYPE 
{ 
    SE_UNKNOWN_OBJECT_TYPE, 
    SE_FILE_OBJECT, 
    SE_SERVICE, 
    SE_PRINTER, 
    SE_REGISTRY_KEY, 
    SE_LMSHARE, 
    SE_KERNEL_OBJECT, 
    SE_WINDOW_OBJECT, 
    SE_DS_OBJECT, 
    SE_DS_OBJECT_ALL, 
    SE_PROVIDER_DEFINED_OBJECT, 
    SE_WMIGUID_OBJECT, 
    SE_REGISTRY_WOW64_32 
} 

private enum SECURITY_INFORMATION 
{ 
    DACL_SECURITY_INFORMATION = 4, 
    GROUP_SECURITY_INFORMATION = 2, 
    OWNER_SECURITY_INFORMATION = 1, 
    PROTECTED_DACL_SECURITY_INFORMATION = 0x20, 
    PROTECTED_SACL_SECURITY_INFORMATION = 0x10, 
    SACL_SECURITY_INFORMATION = 8, 
    UNPROTECTED_DACL_SECURITY_INFORMATION = 0x80, 
    UNPROTECTED_SACL_SECURITY_INFORMATION = 0x40 
} 

[StructLayout(LayoutKind.Sequential)] 
private struct SID_IDENTIFIER_AUTHORITY 
{ 
    [MarshalAs(UnmanagedType.ByValArray, SizeConst=6)] 
    public byte[] Value; 
} } 
+5

나는 필요하지 않지만 모든 사람이 볼 수 있도록 솔루션을 게시하면 좋을 것입니다. 다른 사람이 같은 질문을 할 수도 있습니다. –

+3

정말로 해결책을 게시하면됩니다. 더 많은 "plzsendtehcodez kthx"답변을 수집하는 것은 아무에게도 쓸모가 없습니다. – sth

+0

스택 오버플로의 목적은 관련 프로그래밍 관련 질문에 대한 좋은 답변을 수집하는 것입니다. 솔루션이 존재 함을 알리는 대신 자동으로 실제 솔루션을 게시하도록 기본값을 설정해야합니다. –

관련 문제