2010-02-08 9 views
5

Esiste un'API in Windows simile a Linux chown?Cambia proprietario di file in Windows

+0

Il modello di sicurezza di Windows non si basa proprio sulla proprietà dei file come i file system UNIX, quindi questo non è realmente uno strumento che è necessario molto spesso. –

risposta

3

Tratto da qui: http://www.perlmonks.org/?node_id=70562

// #includes omitted for the sake of sanity 
    HANDLE token; 
    char *filename = "somefile.txt"; 
    char *newuser = "someuser"; 
    DWORD len; 
    PSECURITY_DESCRIPTOR security = NULL; 
    PSID sidPtr = NULL; 
    int retValue = 1; 

    // Get the privileges you need 
    if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &token)) { 
     SetPrivilege(token, "SeTakeOwnershipPrivilege", 1); 
     SetPrivilege(token, "SeSecurityPrivilege", 1); 
     SetPrivilege(token, "SeBackupPrivilege", 1); 
     SetPrivilege(token, "SeRestorePrivilege", 1); 
    } else retValue = 0; 

    // Create the security descriptor 
    if (retValue) { 
     GetFileSecurity(filename, OWNER_SECURITY_INFORMATION, security, 0, &len); 
     security = (PSECURITY_DESCRIPTOR)malloc(len); 
     if (!InitializeSecurityDescriptor(security, SECURITY_DESCRIPTOR_REVISION)) 
      retValue = 0; 
    } 

    // Get the sid for the username 
    if (retValue) { 
     char domainbuf[4096]; 
     DWORD sidSize = 0; 
     DWORD bufSize = 4096; 
     SID_NAME_USE sidUse; 
     LookupAccountName(NULL, newuser, sidPtr, &sidSize, domainbuf, &bufSize, &sidUse); 
     sid = (PSID)malloc(sidSize); 
     if (!LookupAccountName(NULL, string, (PSID)sid, &sidSize, domainbuf, &bufSize, &sidUse)) 
      retValue = 0; 
     } 
    } 

    // Set the sid to be the new owner 
    if (retValue && !SetSecurityDescriptorOwner(security, sidPtr, 0)) 
     retValue = 0; 

    // Save the security descriptor 
    if (retValue) 
     retValue = SetFileSecurity(filename, OWNER_SECURITY_INFORMATION, security); 
    if (security) free(security); 
    if (sid) free(sid); 
    return retValue; 

`

+3

Santo inferno, tutto questo per sostituire una semplice chiamata "chown"! –

+0

Hai omesso la funzione restituire tipo, nome e parametri per motivi di vaghezza? –

1

si potrebbe trovare il utile cacls or icacls commands ... Non sono esattamente facile da usare anche se

può fornire un po 'più di informazioni su cosa stai cercando di fare?

Problemi correlati